aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-01-29 00:39:03 +0000
committerUlrich Drepper <drepper@redhat.com>2003-01-29 00:39:03 +0000
commit6cf26f4168aef852d7fa4106b59af1a7fc40c650 (patch)
tree5b749a1f696051bf18a600a15dc1a0150a931b0e
parent4a99d1604d9e5790cc8a96287ec34e4abff4960b (diff)
downloadglibc-6cf26f4168aef852d7fa4106b59af1a7fc40c650.tar.xz
glibc-6cf26f4168aef852d7fa4106b59af1a7fc40c650.zip
Update.
* Makefile (libpthread-routines): Remove lowlevelrwlock. Add pthread_rwlock_rdlock, pthread_rwlock_timedrdlock, pthread_rwlock_wrlock, pthread_rwlock_timedwrlock, and pthread_rwlock_unlock. * sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S: Removed * sysdeps/unix/sysv/linux/i386/i586/lowlevelrwlock.S: Removed * sysdeps/unix/sysv/linux/i386/i686/lowlevelrwlock.S: Removed * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: New file. * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: New file. * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: New file. * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: New file. * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: New file. * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_rdlock.S: New file. * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S: New file. * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_wrlock.S: New file. * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S: New file. * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_unlock.S: New file. * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_rdlock.S: New file. * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S: New file. * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S: New file. * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S: New file. * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_unlock.S: New file.
-rw-r--r--nptl/ChangeLog29
-rw-r--r--nptl/Makefile5
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S668
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S654
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelsem.S334
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S158
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S192
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S184
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S112
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S148
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_rdlock.S (renamed from nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelrwlock.S)6
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S20
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S20
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_unlock.S (renamed from nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelsem.S)6
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_wrlock.S (renamed from nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelcond.S)6
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelsem.S20
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_rdlock.S (renamed from nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelcond.S)6
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S20
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S20
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_unlock.S (renamed from nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelrwlock.S)6
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S20
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/lowlevelrwlock.h28
22 files changed, 970 insertions, 1692 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 94e0eb64dc..26bbedd281 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,5 +1,34 @@
2003-01-28 Ulrich Drepper <drepper@redhat.com>
+ * Makefile (libpthread-routines): Remove lowlevelrwlock. Add
+ pthread_rwlock_rdlock, pthread_rwlock_timedrdlock,
+ pthread_rwlock_wrlock, pthread_rwlock_timedwrlock, and
+ pthread_rwlock_unlock.
+ * sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S: Removed
+ * sysdeps/unix/sysv/linux/i386/i586/lowlevelrwlock.S: Removed
+ * sysdeps/unix/sysv/linux/i386/i686/lowlevelrwlock.S: Removed
+ * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: New file.
+ * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S:
+ New file.
+ * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: New file.
+ * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S:
+ New file.
+ * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: New file.
+ * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_rdlock.S: New file.
+ * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S:
+ New file.
+ * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_wrlock.S: New file.
+ * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S:
+ New file.
+ * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_unlock.S: New file.
+ * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_rdlock.S: New file.
+ * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S:
+ New file.
+ * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S: New file.
+ * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S:
+ New file.
+ * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_unlock.S: New file.
+
* Makefile (libpthread-routines): Remove lowlevelcond and
lowlevelsem. Add sem_wait, sem_trywait, sem_timedwait, sem_post,
pthread_cond_wait, pthread_cond_timedwait, pthread_cond_signal,
diff --git a/nptl/Makefile b/nptl/Makefile
index 3409a93ea9..507e1f8c92 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -58,7 +58,10 @@ libpthread-routines = init events version \
pthread_mutexattr_setpshared \
pthread_mutexattr_gettype pthread_mutexattr_settype \
pthread_rwlock_init pthread_rwlock_destroy \
+ pthread_rwlock_rdlock pthread_rwlock_timedrdlock \
+ pthread_rwlock_wrlock pthread_rwlock_timedwrlock \
pthread_rwlock_tryrdlock pthread_rwlock_trywrlock \
+ pthread_rwlock_unlock \
pthread_rwlockattr_init pthread_rwlockattr_destroy \
pthread_rwlockattr_getpshared \
pthread_rwlockattr_setpshared \
@@ -96,7 +99,7 @@ libpthread-routines = init events version \
cleanup cleanup_defer \
pt-longjmp \
cancellation \
- lowlevellock lowlevelmutex lowlevelrwlock \
+ lowlevellock lowlevelmutex \
pt-vfork \
ptw-write ptw-read ptw-close ptw-fcntl ptw-accept \
ptw-connect ptw-recv ptw-recvfrom ptw-recvmsg ptw-send \
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S
deleted file mode 100644
index 83a4fb330b..0000000000
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S
+++ /dev/null
@@ -1,668 +0,0 @@
-/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#include <shlib-compat.h>
-
-#ifdef UP
-# define LOCK
-#else
-# define LOCK lock
-#endif
-
-#define SYS_gettimeofday __NR_gettimeofday
-#define SYS_futex 240
-#define FUTEX_WAIT 0
-#define FUTEX_WAKE 1
-
-#define ETIMEDOUT 110
-
-#define cond_lock 0
-#define total_seq 4
-#define wakeup_seq 12
-#define woken_seq 20
-
-
- .text
-
- .align 16
- .type condvar_cleanup, @function
-condvar_cleanup:
- pushl %ebx
- movl 8(%esp), %ebx
-#if cond_lock != 0
- addl $cond_lock, %ebx
-#endif
-
- /* Get internal lock. */
- movl $1, %eax
- LOCK
-#if cond_lock == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, cond_lock(%ebx)
-#endif
- testl %eax, %eax
- je 1f
-
-#if cond_lock == 0
- movl %ebx, %ecx
-#else
- leal cond_lock(%ebx), %ecx
-#endif
- call __lll_mutex_lock_wait
-
-1: addl $1, wakeup_seq(%ebx)
- adcl $0, wakeup_seq+4(%ebx)
-
- addl $1, woken_seq(%ebx)
- adcl $0, woken_seq+4(%ebx)
-
- LOCK
- decl (%ebx)
- je 2f
-#if cond_lock == 0
- movl %ebx, %eax
-#else
- leal cond_lock(%ebx), %eax
-#endif
- call __lll_mutex_unlock_wake
-
-2: popl %ebx
- ret
- .size condvar_cleanup, .-condvar_cleanup
-
-
-/* int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) */
- .globl __pthread_cond_wait
- .type __pthread_cond_wait, @function
- .align 16
-__pthread_cond_wait:
-
- pushl %edi
- pushl %esi
- pushl %ebx
-
- xorl %esi, %esi
- movl 16(%esp), %ebx
-#if cond_lock != 0
- addl $cond_lock, %ebx
-#endif
-
- /* Get internal lock. */
- movl $1, %eax
- LOCK
-#if cond_lock == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, cond_lock(%ebx)
-#endif
- testl %eax, %eax
- jne 1f
-
- /* Unlock the mutex. */
-2: pushl 20(%esp)
- call __pthread_mutex_unlock_internal
-
- addl $1, total_seq(%ebx)
- adcl $0, total_seq+4(%ebx)
-
- /* Install cancellation handler. */
-#ifdef PIC
- call __i686.get_pc_thunk.cx
- addl $_GLOBAL_OFFSET_TABLE_, %ecx
- leal condvar_cleanup@GOTOFF(%ecx), %eax
-#else
- leal condvar_cleanup, %eax
-#endif
- subl $24, %esp
- leal 12(%esp), %edx
- movl %ebx, 8(%esp)
- movl %eax, 4(%esp)
- movl %edx, (%esp)
- call __pthread_cleanup_push
-
- /* Get and store current wakeup_seq value. */
- movl wakeup_seq(%ebx), %edi
- movl wakeup_seq+4(%ebx), %edx
- movl %edi, 4(%esp)
- movl %edx, 8(%esp)
-
- /* Unlock. */
-8: LOCK
-#if cond_lock == 0
- decl (%ebx)
-#else
- decl cond_lock(%ebx)
-#endif
- jne 3f
-
-4: call __pthread_enable_asynccancel
- movl %eax, (%esp)
-
- movl %esi, %ecx /* movl $FUTEX_WAIT, %ecx */
- movl %edi, %edx
- addl $wakeup_seq-cond_lock, %ebx
- movl $SYS_futex, %eax
- ENTER_KERNEL
- subl $wakeup_seq-cond_lock, %ebx
-
- call __pthread_disable_asynccancel
-
- /* Lock. */
- movl $1, %eax
- LOCK
-#if cond_lock == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, cond_lock(%ebx)
-#endif
- testl %eax, %eax
- jne 5f
-
-6: movl woken_seq(%ebx), %eax
- movl woken_seq+4(%ebx), %ecx
-
- movl wakeup_seq(%ebx), %edi
- movl wakeup_seq+4(%ebx), %edx
-
- cmpl 8(%esp), %ecx
- ja 7f
- jb 8b
- cmpl 4(%esp), %eax
- jb 8b
-
-7: cmpl %ecx, %edx
- ja 9f
- jb 8b
- cmp %eax, %edi
- jna 8b
-
-9: addl $1, woken_seq(%ebx)
- adcl $0, woken_seq+4(%ebx)
-
- LOCK
-#if cond_lock == 0
- decl (%ebx)
-#else
- decl cond_lock(%ebx)
-#endif
- jne 10f
-
- /* Remove cancellation handler. */
-11: leal 12(%esp), %edx
- movl $0, 4(%esp)
- movl %edx, (%esp)
- call __pthread_cleanup_pop
-
- movl 48(%esp), %eax
- movl %eax, (%esp)
- call __pthread_mutex_lock_internal
- addl $28, %esp
-
- popl %ebx
- popl %esi
- popl %edi
-
- /* We return the result of the mutex_lock operation. */
- ret
-
- /* Initial locking failed. */
-1:
-#if cond_lock == 0
- movl %ebx, %ecx
-#else
- leal cond_lock(%ebx), %ecx
-#endif
- call __lll_mutex_lock_wait
- jmp 2b
-
- /* Unlock in loop requires waekup. */
-3:
-#if cond_lock == 0
- movl %ebx, %eax
-#else
- leal cond_lock(%ebx), %eax
-#endif
- call __lll_mutex_unlock_wake
- jmp 4b
-
- /* Locking in loop failed. */
-5:
-#if cond_lock == 0
- movl %ebx, %ecx
-#else
- leal cond_lock(%ebx), %ecx
-#endif
- call __lll_mutex_lock_wait
- jmp 6b
-
- /* Unlock after loop requires waekup. */
-10:
-#if cond_lock == 0
- movl %ebx, %eax
-#else
- leal cond_lock(%ebx), %eax
-#endif
- call __lll_mutex_unlock_wake
- jmp 11b
- .size __pthread_cond_wait, .-__pthread_cond_wait
-versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait,
- GLIBC_2_3_2)
-
-
-/* int pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex,
- const struct timespec *abstime) */
- .globl __pthread_cond_timedwait
- .type __pthread_cond_timedwait, @function
- .align 16
-__pthread_cond_timedwait:
-
- pushl %ebp
- pushl %edi
- pushl %esi
- pushl %ebx
-
- movl 20(%esp), %ebx
- movl 28(%esp), %ebp
-#if cond_lock != 0
- addl $cond_lock, %ebx
-#endif
-
- /* Get internal lock. */
- movl $1, %eax
- LOCK
-#if cond_lock == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, cond_lock(%ebx)
-#endif
- testl %eax, %eax
- jne 1f
-
- /* Unlock the mutex. */
-2: pushl 24(%esp)
- call __pthread_mutex_unlock_internal
-
- addl $1, total_seq(%ebx)
- adcl $0, total_seq+4(%ebx)
-
- /* Install cancellation handler. */
-#ifdef PIC
- call __i686.get_pc_thunk.cx
- addl $_GLOBAL_OFFSET_TABLE_, %ecx
- leal condvar_cleanup@GOTOFF(%ecx), %eax
-#else
- leal condvar_cleanup, %eax
-#endif
- subl $32, %esp
- leal 16(%esp), %edx
- movl %ebx, 8(%esp)
- movl %eax, 4(%esp)
- movl %edx, (%esp)
- call __pthread_cleanup_push
-
- /* Get and store current wakeup_seq value. */
- movl wakeup_seq(%ebx), %edi
- movl wakeup_seq+4(%ebx), %edx
- movl %edi, 12(%esp)
- movl %edx, 16(%esp)
-
- /* Unlock. */
-8: LOCK
-#if cond_lock == 0
- decl (%ebx)
-#else
- decl cond_lock(%ebx)
-#endif
- jne 3f
-
-4: call __pthread_enable_asynccancel
- movl %eax, (%esp)
-
- /* Get the current time. */
- movl %ebx, %edx
- leal 4(%esp), %ebx
- xorl %ecx, %ecx
- movl $SYS_gettimeofday, %eax
- ENTER_KERNEL
- movl %edx, %ebx
-
- /* Compute relative timeout. */
- movl 8(%esp), %eax
- movl $1000, %edx
- mul %edx /* Milli seconds to nano seconds. */
- movl (%ebp), %ecx
- movl 4(%ebp), %edx
- subl 4(%esp), %ecx
- subl %eax, %edx
- jns 12f
- addl $1000000000, %edx
- decl %ecx
-12: testl %ecx, %ecx
- js 13f
-
- /* Store relative timeout. */
- movl %ecx, 4(%esp)
- movl %edx, 8(%esp)
- leal 4(%esp), %esi
- xorl %ecx, %ecx /* movl $FUTEX_WAIT, %ecx */
- movl %edi, %edx
- addl $wakeup_seq-cond_lock, %ebx
- movl $SYS_futex, %eax
- ENTER_KERNEL
- subl $wakeup_seq-cond_lock, %ebx
- movl %eax, %esi
-
- call __pthread_disable_asynccancel
-
- /* Lock. */
- movl $1, %eax
- LOCK
-#if cond_lock == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, cond_lock(%ebx)
-#endif
- testl %eax, %eax
- jne 5f
-
-6: movl woken_seq(%ebx), %eax
- movl woken_seq+4(%ebx), %ecx
-
- movl wakeup_seq(%ebx), %edi
- movl wakeup_seq+4(%ebx), %edx
-
- cmpl 16(%esp), %ecx
- ja 7f
- jb 15f
- cmpl 12(%esp), %eax
- jb 15f
-
-7: cmpl %ecx, %edx
- ja 9f
- jb 15f
- cmp %eax, %edi
- ja 9f
-
-15: cmpl $-ETIMEDOUT, %esi
- jne 8b
-
-13: addl $1, wakeup_seq(%ebx)
- adcl $0, wakeup_seq+4(%ebx)
- movl $ETIMEDOUT, %esi
- jmp 14f
-
-9: xorl %esi, %esi
-14: addl $1, woken_seq(%ebx)
- adcl $0, woken_seq+4(%ebx)
-
- LOCK
-#if cond_lock == 0
- decl (%ebx)
-#else
- decl cond_lock(%ebx)
-#endif
- jne 10f
-
- /* Remove cancellation handler. */
-11: leal 20(%esp), %edx
- movl $0, 4(%esp)
- movl %edx, (%esp)
- call __pthread_cleanup_pop
-
- movl 60(%esp), %ecx
- movl %ecx, (%esp)
- call __pthread_mutex_lock_internal
- addl $36, %esp
-
- movl %esi, %eax
-
- popl %ebx
- popl %esi
- popl %edi
- popl %ebp
-
- /* We return the result of the mutex_lock operation. */
- ret
-
- /* Initial locking failed. */
-1:
-#if cond_lock == 0
- movl %ebx, %ecx
-#else
- leal cond_lock(%ebx), %ecx
-#endif
- call __lll_mutex_lock_wait
- jmp 2b
-
- /* Unlock in loop requires waekup. */
-3:
-#if cond_lock == 0
- movl %ebx, %eax
-#else
- leal cond_lock(%ebx), %eax
-#endif
- call __lll_mutex_unlock_wake
- jmp 4b
-
- /* Locking in loop failed. */
-5:
-#if cond_lock == 0
- movl %ebx, %ecx
-#else
- leal cond_lock(%ebx), %ecx
-#endif
- call __lll_mutex_lock_wait
- jmp 6b
-
- /* Unlock after loop requires waekup. */
-10:
-#if cond_lock == 0
- movl %ebx, %eax
-#else
- leal cond_lock(%ebx), %eax
-#endif
- call __lll_mutex_unlock_wake
- jmp 11b
- .size __pthread_cond_timedwait, .-__pthread_cond_timedwait
-versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait,
- GLIBC_2_3_2)
-
-
- /* int pthread_cond_signal (pthread_cond_t *cond) */
- .globl __pthread_cond_signal
- .type __pthread_cond_signal, @function
- .align 16
-__pthread_cond_signal:
-
- pushl %esi
- pushl %ebx
-#if cond_lock != 0
- addl $cond_lock, %ebx
-#endif
-
- movl 12(%esp), %ebx
-
- /* Get internal lock. */
- movl $1, %eax
- LOCK
-#if cond_lock == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, cond_lock(%ebx)
-#endif
- testl %eax, %eax
- jne 1f
-
-2: movl total_seq+4(%ebx), %eax
- movl total_seq(%ebx), %ecx
- cmpl wakeup_seq+4(%ebx), %eax
- ja 3f
- jb 4f
- cmpl wakeup_seq(%ebx), %ecx
- jbe 4f
-
- /* Bump the wakeup number. */
-3: addl $1, wakeup_seq(%ebx)
- adcl $0, wakeup_seq+4(%ebx)
-
- /* Wake up one thread. */
- addl $wakeup_seq-cond_lock, %ebx
- movl $FUTEX_WAKE, %ecx
- xorl %esi, %esi
- movl $SYS_futex, %eax
- movl %ecx, %edx /* movl $1, %edx */
- ENTER_KERNEL
-
- subl $wakeup_seq-cond_lock, %ebx
-
- /* Unlock. */
-4: LOCK
-#if cond_lock == 0
- decl (%ebx)
-#else
- decl cond_lock(%ebx)
-#endif
- jne 5f
-
-6: xorl %eax, %eax
- popl %ebx
- popl %esi
- ret
-
- /* Initial locking failed. */
-1:
-#if cond_lock == 0