diff options
author | Ulrich Drepper <drepper@redhat.com> | 2008-01-10 18:34:43 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2008-01-10 18:34:43 +0000 |
commit | ab355d9aa5186937757b20b93f7d52ea3926427a (patch) | |
tree | 202797696b5ede624ce3e0bfeb14e39dc4d5dc5f /nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S | |
parent | f6bacb8ef4dfcee39864d6383e3660d8ac267d23 (diff) |
* pthread-errnos.sym: Add EOVERFLOW.
* sysdeps/unix/sysv/linux/structsem.sym: Add SEM_VALUE_MAX.
* sysdeps/unix/sysv/linux/sem_post.c: Don't overflow value field.
* sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Likewise.
* sysdeps/unix/sysv/linux/x86_64/sem_post.S: Likewise.
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S')
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S index adbbcdfa71..b4014c6505 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2005, 2007, 2008 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -30,12 +30,21 @@ .type sem_post,@function .align 16 sem_post: +#if VALUE == 0 + movl (%rdi), %eax +#else + movl VALUE(%rdi), %eax +#endif +0: cmpl $SEM_VALUE_MAX, %eax + je 3f + leal 1(%eax), %esi LOCK #if VALUE == 0 - addl $1, (%rdi) + cmpxchgl %esi, (%rdi) #else - addl $1, VALUE(%rdi) + cmpxchgl %esi, VALUE(%rdi) #endif + jnz 0b cmpq $0, NWAITERS(%rdi) je 2f @@ -54,13 +63,28 @@ sem_post: 1: #if USE___THREAD - movq errno@gottpoff(%rip), %rdx - movl $EINVAL, %fs:(%rdx) + movl $EINVAL, %eax #else callq __errno_location@plt - movl $EINVAL, (%rax) + movl $EINVAL, %edx #endif + jmp 4f +3: +#if USE___THREAD + movl $EOVERFLOW, %eax +#else + callq __errno_location@plt + movl $EOVERFLOW, %edx +#endif + +4: +#if USE___THREAD + movq errno@gottpoff(%rip), %rdx + movl %eax, %fs:(%rdx) +#else + movl %edx, (%rax) +#endif orl $-1, %eax retq .size sem_post,.-sem_post |