aboutsummaryrefslogtreecommitdiff
path: root/nptl
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 /nptl
parent4a99d1604d9e5790cc8a96287ec34e4abff4960b (diff)
downloadglibc-6cf26f4168aef852d7fa4106b59af1a7fc40c650.tar
glibc-6cf26f4168aef852d7fa4106b59af1a7fc40c650.tar.gz
glibc-6cf26f4168aef852d7fa4106b59af1a7fc40c650.tar.bz2
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.
Diffstat (limited to 'nptl')
-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
- movl %ebx, %ecx
-#else
- leal cond_lock(%ebx), %ecx
-#endif
- call __lll_mutex_lock_wait
- jmp 2b
-
- /* Unlock in loop requires waekup. */
-5:
-#if cond_lock == 0
- movl %ebx, %eax
-#else
- leal cond_lock(%ebx), %eax
-#endif
- call __lll_mutex_unlock_wake
- jmp 6b
- .size __pthread_cond_signal, .-__pthread_cond_signal
-versioned_symbol (libpthread, __pthread_cond_signal, pthread_cond_signal,
- GLIBC_2_3_2)
-
-
- /* int pthread_cond_broadcast (pthread_cond_t *cond) */
- .globl __pthread_cond_broadcast
- .type __pthread_cond_broadcast, @function
- .align 16
-__pthread_cond_broadcast:
-
- pushl %esi
- pushl %ebx
-
- movl 12(%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
-
-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
- jna 4f
-
- /* Case all currently waiting threads to wake up. */
-3: movl %ecx, wakeup_seq(%ebx)
- movl %eax, wakeup_seq+4(%ebx)
-
- /* Wake up all threads. */
- addl $wakeup_seq-cond_lock, %ebx
- movl $FUTEX_WAKE, %ecx
- xorl %esi, %esi
- movl $SYS_futex, %eax
- movl $0x7fffffff, %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
- movl %ebx, %ecx
-#else
- leal cond_lock(%ebx), %ecx
-#endif
- call __lll_mutex_lock_wait
- jmp 2b
-
- /* Unlock in loop requires waekup. */
-5:
-#if cond_lock == 0
- movl %ebx, %eax
-#else
- leal cond_lock(%ebx), %eax
-#endif
- call __lll_mutex_unlock_wake
- jmp 6b
- .size __pthread_cond_broadcast, .-__pthread_cond_broadcast
-versioned_symbol (libpthread, __pthread_cond_broadcast, pthread_cond_broadcast,
- GLIBC_2_3_2)
-
-
-#ifdef PIC
- .section .gnu.linkonce.t.__i686.get_pc_thunk.cx,"ax",@progbits
- .globl __i686.get_pc_thunk.cx
- .hidden __i686.get_pc_thunk.cx
- .type __i686.get_pc_thunk.cx,@function
-__i686.get_pc_thunk.cx:
- movl (%esp), %ecx;
- ret
- .size __i686.get_pc_thunk.cx,.-__i686.get_pc_thunk.cx
-#endif
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S
deleted file mode 100644
index cc2885ebc9..0000000000
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S
+++ /dev/null
@@ -1,654 +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>
-
- .text
-
-#define SYS_gettimeofday __NR_gettimeofday
-#define SYS_futex 240
-#define FUTEX_WAIT 0
-#define FUTEX_WAKE 1
-
-#define EAGAIN 11
-#define EDEADLK 35
-#define ETIMEDOUT 110
-
-/* Offsets in the pthread_rwlock_t structure. */
-#define MUTEX 0
-#define NR_READERS 4
-#define READERS_WAKEUP 8
-#define WRITERS_WAKEUP 12
-#define READERS_QUEUED 16
-#define WRITERS_QUEUED 20
-#define FLAGS 24
-#define WRITER 28
-
-#ifndef UP
-# define LOCK lock
-#else
-# define LOCK
-#endif
-
-
- .globl __pthread_rwlock_rdlock
- .type __pthread_rwlock_rdlock,@function
- .align 16
-__pthread_rwlock_rdlock:
- pushl %esi
- pushl %ebx
-
- xorl %esi, %esi
- xorl %edx, %edx
- movl 12(%esp), %ebx
-
- /* Get the lock. */
- movl $1, %eax
- LOCK
-#if MUTEX == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, MUTEX(%ebx)
-#endif
- testl %eax, %eax
- jne 1f
-
-2: movl WRITER(%ebx), %eax
- testl %eax, %eax
- jne 14f
- cmp $0, WRITERS_QUEUED(%ebx)
- je 5f
- cmpl $0, FLAGS(%ebx)
- je 5f
-
-3: incl READERS_QUEUED(%ebx)
- je 4f
-
- LOCK
-#if MUTEX == 0
- decl (%ebx)
-#else
- decl MUTEX(%ebx)
-#endif
- jne 10f
-
-11: addl $READERS_WAKEUP-MUTEX, %ebx
- movl %esi, %ecx /* movl $FUTEX_WAIT, %ecx */
- movl $SYS_futex, %eax
- ENTER_KERNEL
-
- subl $READERS_WAKEUP-MUTEX, %ebx
-
- /* Reget the lock. */
- movl $1, %eax
- LOCK
-#if MUTEX == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, MUTEX(%ebx)
-#endif
- testl %eax, %eax
- jne 12f
-
-13: decl READERS_QUEUED(%ebx)
- jne 2b
- movl $0, READERS_WAKEUP(%ebx)
- jmp 2b
-
-5: xorl %ecx, %ecx
- incl NR_READERS(%ebx)
- je 8f
-9: LOCK
-#if MUTEX == 0
- decl (%ebx)
-#else
- decl MUTEX(%ebx)
-#endif
- jne 6f
-7:
-
- movl %ecx, %eax
- popl %ebx
- popl %esi
- ret
-
-1: movl %ebx, %ecx
- call __lll_mutex_lock_wait
- jmp 2b
-
-14: cmpl %gs:8, %eax
- jne 3b
- /* Deadlock detected. */
- movl $EDEADLK, %ecx
- jmp 9b
-
-6: movl %ebx, %eax
- call __lll_mutex_unlock_wake
- jmp 7b
-
- /* Overflow. */
-8: decl NR_READERS(%ebx)
- movl $EAGAIN, %ecx
- jmp 9b
-
- /* Overflow. */
-4: decl READERS_QUEUED(%ebx)
- movl $EAGAIN, %ecx
- jmp 9b
-
-10: movl %ebx, %eax
- call __lll_mutex_unlock_wake
- jmp 11b
-
-12: movl %ebx, %ecx
- call __lll_mutex_lock_wait
- jmp 13b
- .size __pthread_rwlock_rdlock,.-__pthread_rwlock_rdlock
-
- .globl pthread_rwlock_rdlock
-pthread_rwlock_rdlock = __pthread_rwlock_rdlock
-
- .globl __pthread_rwlock_rdlock_internal
-__pthread_rwlock_rdlock_internal = __pthread_rwlock_rdlock
-
-
- .globl pthread_rwlock_timedrdlock
- .type pthread_rwlock_timedrdlock,@function
- .align 16
-pthread_rwlock_timedrdlock:
- pushl %esi
- pushl %edi
- pushl %ebx
- pushl %ebp
- subl $8, %esp
-
- movl 28(%esp), %ebp
- movl 32(%esp), %edi
-
- /* Get the lock. */
- movl $1, %eax
- LOCK
-#if MUTEX == 0
- xaddl %eax, (%ebp)
-#else
- xaddl %eax, MUTEX(%ebp)
-#endif
- testl %eax, %eax
- jne 1f
-
-2: movl WRITER(%ebp), %eax
- testl %eax, %eax
- jne 14f
- cmp $0, WRITERS_QUEUED(%ebp)
- je 5f
- cmpl $0, FLAGS(%ebp)
- je 5f
-
-3: incl READERS_QUEUED(%ebp)
- je 4f
-
- LOCK
-#if MUTEX == 0
- decl (%ebp)
-#else
- decl MUTEX(%ebp)
-#endif
- jne 10f
-
- /* Get current time. */
- movl %esp, %ebx
- xorl %ecx, %ecx
- movl $SYS_gettimeofday, %eax
- ENTER_KERNEL
-
- /* Compute relative timeout. */
- movl 4(%esp), %eax
- movl $1000, %edx
- mul %edx /* Milli seconds to nano seconds. */
- movl (%edi), %ecx
- movl 4(%edi), %edx
- subl (%esp), %ecx
- subl %eax, %edx
- jns 15f
- addl $1000000000, %edx
- decl %ecx
-15: testl %ecx, %ecx
- js 16f /* Time is already up. */
-
- /* Futex call. */
- movl %ecx, (%esp) /* Store relative timeout. */
- movl %edx, 4(%esp)
- xorl %ecx, %ecx /* movl $FUTEX_WAIT, %ecx */
- movl %esp, %esi
- movl %ecx, %edx
- leal READERS_WAKEUP(%ebp), %ebx
- movl $SYS_futex, %eax
- ENTER_KERNEL
- movl %eax, %edx
-17:
-
- /* Reget the lock. */
- movl $1, %eax
- LOCK
-#if MUTEX == 0
- xaddl %eax, (%ebp)
-#else
- xaddl %eax, MUTEX(%ebp)
-#endif
- testl %eax, %eax
- jne 12f
-
-13: cmpl $-ETIMEDOUT, %ecx
- je 18f
- decl READERS_QUEUED(%ebp)
- jne 2b
- movl $0, READERS_WAKEUP(%ebp)
- jmp 2b
-
-
-5: xorl %ecx, %ecx
- incl NR_READERS(%ebp)
- je 8f
-9: LOCK
-#if MUTEX == 0
- decl (%ebp)
-#else
- decl MUTEX(%ebp)
-#endif
- jne 6f
-
-7: movl %ecx, %eax
-
- addl $8, %esp
- popl %ebp
- popl %ebx
- popl %edi
- popl %esi
- ret
-
-1: movl %ebp, %ecx
- call __lll_mutex_lock_wait
- jmp 2b
-
-14: cmpl %gs:8, %eax
- jne 3b
- movl $EDEADLK, %ecx
- jmp 9b
-
-6: movl %ebp, %eax
- call __lll_mutex_unlock_wake
- jmp 7b
-
- /* Overflow. */
-8: decl NR_READERS(%ebp)
- movl $EAGAIN, %ecx
- jmp 9b
-
- /* Overflow. */
-4: decl READERS_QUEUED(%ebp)
- movl $EAGAIN, %ecx
- jmp 9b
-
-10: movl %ebp, %eax
- call __lll_mutex_unlock_wake
- jmp 11b
-
-12: movl %ebx, %ecx
- call __lll_mutex_lock_wait
- jmp 13b
-
-16: movl $-ETIMEDOUT, %ecx
- jmp 17b
-
-18: movl $ETIMEDOUT, %ecx
- jmp 9b
- .size pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock
-
-
- .globl __pthread_rwlock_wrlock
- .type __pthread_rwlock_wrlock,@function
- .align 16
-__pthread_rwlock_wrlock:
- pushl %esi
- pushl %ebx
-
- xorl %esi, %esi
- xorl %edx, %edx
- movl 12(%esp), %ebx
-
- /* Get the lock. */
- movl $1, %eax
- LOCK
-#if MUTEX == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, MUTEX(%ebx)
-#endif
- testl %eax, %eax
- jne 1f
-
-2: movl WRITER(%ebx), %eax
- testl %eax, %eax
- jne 14f
- cmp $0, NR_READERS(%ebx)
- je 5f
-
-3: incl WRITERS_QUEUED(%ebx)
- je 4f
-
- LOCK
-#if MUTEX == 0
- decl (%ebx)
-#else
- decl MUTEX(%ebx)
-#endif
- jne 10f
-
-11: addl $WRITERS_WAKEUP-MUTEX, %ebx
- movl %esi, %ecx /* movl $FUTEX_WAIT, %ecx */
- movl $SYS_futex, %eax
- ENTER_KERNEL
-
- subl $WRITERS_WAKEUP-MUTEX, %ebx
-
- /* Reget the lock. */
- movl $1, %eax
- LOCK
-#if MUTEX == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, MUTEX(%ebx)
-#endif
- testl %eax, %eax
- jne 12f
-
-13: decl WRITERS_QUEUED(%ebx)
- movl $0, WRITERS_WAKEUP(%ebx)
- jmp 2b
-
-5: xorl %ecx, %ecx
- movl %gs:8, %eax
- movl %eax, WRITER(%ebx)
-9: LOCK
-#if MUTEX == 0
- decl (%ebx)
-#else
- decl MUTEX(%ebx)
-#endif
- jne 6f
-7:
-
- movl %ecx, %eax
- popl %ebx
- popl %esi
- ret
-
-1: movl %ebx, %ecx
- call __lll_mutex_lock_wait
- jmp 2b
-
-14: cmpl %gs:8, %eax
- jne 3b
- movl $EDEADLK, %ecx
- jmp 9b
-
-6: movl %ebx, %eax
- call __lll_mutex_unlock_wake
- jmp 7b
-
-4: decl WRITERS_QUEUED(%ebx)
- movl $EAGAIN, %ecx
- jmp 9b
-
-10: movl %ebx, %eax
- call __lll_mutex_unlock_wake
- jmp 11b
-
-12: movl %ebx, %ecx
- call __lll_mutex_lock_wait
- jmp 13b
- .size __pthread_rwlock_wrlock,.-__pthread_rwlock_wrlock
-
- .globl pthread_rwlock_wrlock
-pthread_rwlock_wrlock = __pthread_rwlock_wrlock
-
- .globl __pthread_rwlock_wrlock_internal
-__pthread_rwlock_wrlock_internal = __pthread_rwlock_wrlock
-
-
- .globl pthread_rwlock_timedwrlock
- .type pthread_rwlock_timedwrlock,@function
- .align 16
-pthread_rwlock_timedwrlock:
- pushl %esi
- pushl %edi
- pushl %ebx
- pushl %ebp
- subl $8, %esp
-
- movl 28(%esp), %ebp
- movl 32(%esp), %edi
-
- /* Get the lock. */
- movl $1, %eax
- LOCK
-#if MUTEX == 0
- xaddl %eax, (%ebp)
-#else
- xaddl %eax, MUTEX(%ebp)
-#endif
- testl %eax, %eax
- jne 1f
-
-2: movl WRITER(%ebp), %eax
- testl %eax, %eax
- jne 14f
- cmp $0, NR_READERS(%ebp)
- je 5f
-
-3: incl WRITERS_QUEUED(%ebp)
- je 4f
-
- LOCK
-#if MUTEX == 0
- decl (%ebp)
-#else
- decl MUTEX(%ebp)
-#endif
- jne 10f
-
- /* Get current time. */
- movl %esp, %ebx
- xorl %ecx, %ecx
- movl $SYS_gettimeofday, %eax
- ENTER_KERNEL
-
- /* Compute relative timeout. */
- movl 4(%esp), %eax
- movl $1000, %edx
- mul %edx /* Milli seconds to nano seconds. */
- movl (%edi), %ecx
- movl 4(%edi), %edx
- subl (%esp), %ecx
- subl %eax, %edx
- jns 15f
- addl $1000000000, %edx
- decl %ecx
-15: testl %ecx, %ecx
- js 16f /* Time is already up. */
-
- /* Futex call. */
- movl %ecx, (%esp) /* Store relative timeout. */
- movl %edx, 4(%esp)
- xorl %ecx, %ecx /* movl $FUTEX_WAIT, %ecx */
- movl %esp, %esi
- movl %ecx, %edx
- leal WRITERS_WAKEUP(%ebp), %ebx
- movl $SYS_futex, %eax
- ENTER_KERNEL
- movl %eax, %edx
-17:
-
- /* Reget the lock. */
- movl $1, %eax
- LOCK
-#if MUTEX == 0
- xaddl %eax, (%ebp)
-#else
- xaddl %eax, MUTEX(%ebp)
-#endif
- testl %eax, %eax
- jne 12f
-
-13: cmpl $-ETIMEDOUT, %ecx
- je 18f
- decl WRITERS_QUEUED(%ebp)
- movl $0, WRITERS_WAKEUP(%ebp)
- jmp 2b
-
-
-5: xorl %ecx, %ecx
- movl %gs:8, %eax
- movl %eax, WRITER(%ebp)
-9: LOCK
-#if MUTEX == 0
- decl (%ebp)
-#else
- decl MUTEX(%ebp)
-#endif
- jne 6f
-
-7: movl %ecx, %eax
-
- addl $8, %esp
- popl %ebp
- popl %ebx
- popl %edi
- popl %esi
- ret
-
-1: movl %ebp, %ecx
- call __lll_mutex_lock_wait
- jmp 2b
-
-14: cmpl %gs:8, %eax
- jne 3b
- movl $EDEADLK, %ecx
- jmp 9b
-
-6: movl %ebp, %eax
- call __lll_mutex_unlock_wake
- jmp 7b
-
- /* Overflow. */
-4: decl WRITERS_QUEUED(%ebp)
- movl $EAGAIN, %ecx
- jmp 9b
-
-10: movl %ebp, %eax
- call __lll_mutex_unlock_wake
- jmp 11b
-
-12: movl %ebx, %ecx
- call __lll_mutex_lock_wait
- jmp 13b
-
-16: movl $-ETIMEDOUT, %ecx
- jmp 17b
-
-18: movl $ETIMEDOUT, %ecx
- jmp 9b
- .size pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock
-
- .globl __pthread_rwlock_unlock
- .type __pthread_rwlock_unlock,@function
- .align 16
-__pthread_rwlock_unlock:
- pushl %ebx
- pushl %esi
- pushl %edi
-
- xorl %esi, %esi
- xorl %edx, %edx
- movl 16(%esp), %edi
-
- /* Get the lock. */
- movl $1, %eax
- LOCK
-#if MUTEX == 0
- xaddl %eax, (%edi)
-#else
- xaddl %eax, MUTEX(%edi)
-#endif
- testl %eax, %eax
- jne 1f
-
-2: cmpl $0, WRITER(%edi)
- jne 5f
- decl NR_READERS(%edi)
- jnz 6f
-
-5: movl $0, WRITER(%edi)
-
- movl $0x7fffffff, %edx
- leal READERS_WAKEUP(%edi), %ebx
- movl $1, %ecx
- leal WRITERS_WAKEUP(%edi), %eax
- cmpl $0, WRITERS_QUEUED(%edi)
-#ifdef HAVE_CMOV
- cmovnel %ecx, %edx
- cmovnel %eax, %ebx
-#else
- je 0f
- movl %ecx, %edx
- movl %eax, %ebx
-0:
-#endif
- movl $SYS_futex, %eax
- ENTER_KERNEL
-
-6: LOCK
-#if MUTEX == 0
- decl (%edi)
-#else
- decl MUTEX(%edi)
-#endif
- jne 3f
-
-4: xorl %eax, %eax
- popl %edi
- popl %esi
- popl %ebx
- ret
-
-1: movl %edi, %ecx
- call __lll_mutex_lock_wait
- jmp 2b
-
-3: movl %edi, %eax
- call __lll_mutex_unlock_wake
- jmp 4b
-
- .size __pthread_rwlock_unlock,.-__pthread_rwlock_unlock
-
- .globl pthread_rwlock_unlock
-pthread_rwlock_unlock = __pthread_rwlock_unlock
-
- .globl __pthread_rwlock_unlock_internal
-__pthread_rwlock_unlock_internal = __pthread_rwlock_unlock
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelsem.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelsem.S
deleted file mode 100644
index 1e32ec0767..0000000000
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelsem.S
+++ /dev/null
@@ -1,334 +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>
-
- .text
-
-#ifndef UP
-# define LOCK lock
-#else
-# define
-#endif
-
-#define SYS_gettimeofday __NR_gettimeofday
-#define SYS_futex 240
-#define FUTEX_WAKE 1
-
-#define EINTR 4
-#define EAGAIN 11
-#define EWOULDBLOCK EAGAIN
-#define EINVAL 22
-#define ETIMEDOUT 110
-
-
- .globl __new_sem_wait
- .type __new_sem_wait,@function
- .align 16
-__new_sem_wait:
- pushl %ebx
- pushl %esi
-
- movl 12(%esp), %ebx
-
-3: movl (%ebx), %eax
-2: testl %eax, %eax
- je,pn 1f
-
- leal -1(%eax), %edx
- LOCK
- cmpxchgl %edx, (%ebx)
- jne,pn 2b
- xorl %eax, %eax
-
- popl %esi
- popl %ebx
- ret
-
-1: xorl %esi, %esi
- movl $SYS_futex, %eax
- movl %esi, %ecx
- movl %esi, %edx
- ENTER_KERNEL
-
- testl %eax, %eax
- je 3b
- cmpl $-EWOULDBLOCK, %eax
- je 3b
- negl %eax
-#ifdef PIC
- call __i686.get_pc_thunk.bx
-#else
- movl $4f, %ebx
-4:
-#endif
- addl $_GLOBAL_OFFSET_TABLE_, %ebx
-#if USE___THREAD
- movl %gs:0, %edx
- subl errno@gottpoff(%ebx), %edx
- movl %eax, (%edx)
-#else
- movl %eax, %edx
- call __errno_location@plt
- movl %edx, (%eax)
-#endif
- orl $-1, %eax
- popl %esi
- popl %ebx
- ret
- .size __new_sem_wait,.-__new_sem_wait
- .symver __new_sem_wait, sem_wait@@GLIBC_2.1
-#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
- .global __old_sem_wait
-__old_sem_wait = __new_sem_wait
- .symver __old_sem_wait, sem_wait@GLIBC_2.0
-#endif
-
-
- .globl __new_sem_trywait
- .type __new_sem_trywait,@function
- .align 16
-__new_sem_trywait:
- movl 4(%esp), %ecx
-
- movl (%ecx), %eax
-2: testl %eax, %eax
- jz 1f
-
- leal -1(%eax), %edx
- LOCK
- cmpxchgl %edx, (%ecx)
- jne,pn 2b
- xorl %eax, %eax
- ret
-
-1:
-#ifdef PIC
- call __i686.get_pc_thunk.cx
-#else
- movl $3f, %ecx
-3:
-#endif
- addl $_GLOBAL_OFFSET_TABLE_, %ecx
-#if USE___THREAD
- movl %gs:0, %edx
- subl errno@gottpoff(%ecx), %edx
- movl $EAGAIN, (%edx)
-#else
- call __errno_location@plt
- movl $EAGAIN, (%eax)
-#endif
- orl $-1, %eax
- ret
- .size __new_sem_trywait,.-__new_sem_trywait
- .symver __new_sem_trywait, sem_trywait@@GLIBC_2.1
-#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
- .global __old_sem_trywait
-__old_sem_trywait = __new_sem_trywait
- .symver __old_sem_trywait, sem_trywait@GLIBC_2.0
-#endif
-
-
- .globl sem_timedwait
- .type sem_timedwait,@function
- .align 16
-sem_timedwait:
- movl 4(%esp), %ecx
-
- movl (%ecx), %eax
-2: testl %eax, %eax
- je,pn 1f
-
- leal -1(%eax), %edx
- LOCK
- cmpxchgl %edx, (%ecx)
- jne,pn 2b
-
- xorl %eax, %eax
- ret
-
- /* Check whether the timeout value is valid. */
-1: pushl %esi
- pushl %edi
- pushl %ebx
- subl $8, %esp
-
- movl %esp, %esi
- movl 28(%esp), %edi
-
- /* Check for invalid nanosecond field. */
- cmpl $1000000000, 4(%edi)
- movl $EINVAL, %eax
- jae 6f
-
-7: xorl %ecx, %ecx
- movl %esp, %ebx
- movl %ecx, %edx
- movl $SYS_gettimeofday, %eax
- ENTER_KERNEL
-
- /* Compute relative timeout. */
- movl 4(%esp), %eax
- movl $1000, %edx
- mul %edx /* Milli seconds to nano seconds. */
- movl (%edi), %ecx
- movl 4(%edi), %edx
- subl (%esp), %ecx
- subl %eax, %edx
- jns 5f
- addl $1000000000, %edx
- decl %ecx
-5: testl %ecx, %ecx
- movl $ETIMEDOUT, %eax
- js 6f /* Time is already up. */
-
- movl %ecx, (%esp) /* Store relative timeout. */
- movl %edx, 4(%esp)
- movl 24(%esp), %ebx
- xorl %ecx, %ecx
- movl $SYS_futex, %eax
- xorl %edx, %edx
- ENTER_KERNEL
-
- testl %eax, %eax
- je,pt 9f
- cmpl $-EWOULDBLOCK, %eax
- jne 3f
-
-9: movl (%ebx), %eax
-8: testl %eax, %eax
- je 7b
-
- leal -1(%eax), %ecx
- LOCK
- cmpxchgl %ecx, (%ebx)
- jne,pn 8b
-
- addl $8, %esp
- xorl %eax, %eax
- popl %ebx
- popl %edi
- popl %esi
- ret
-
-3: negl %eax
-6:
-#ifdef PIC
- call __i686.get_pc_thunk.bx
-#else
- movl $4f, %ebx
-4:
-#endif
- addl $_GLOBAL_OFFSET_TABLE_, %ebx
-#if USE___THREAD
- movl %gs:0, %edx
- subl errno@gottpoff(%ebx), %edx
- movl %eax, (%edx)
-#else
- movl %eax, %edx
- call __errno_location@plt
- movl %edx, (%eax)
-#endif
-
- addl $8, %esp
- orl $-1, %eax
- popl %ebx
- popl %edi
- popl %esi
- ret
- .size sem_timedwait,.-sem_timedwait
-
-
- .globl __new_sem_post
- .type __new_sem_post,@function
- .align 16
-__new_sem_post:
- pushl %esi
- pushl %ebx
-
- movl 12(%esp), %ebx
- movl $1, %edx
- LOCK
- xaddl %edx, (%ebx)
-
- xorl %esi, %esi
- movl $SYS_futex, %eax
- movl $FUTEX_WAKE, %ecx
- incl %edx
- ENTER_KERNEL
-
- testl %eax, %eax
- js 1f
-
- xorl %eax, %eax
- popl %ebx
- popl %esi
- ret
-
-1:
-#ifdef PIC
- call __i686.get_pc_thunk.bx
-#else
- movl $4f, %ebx
-4:
-#endif
- addl $_GLOBAL_OFFSET_TABLE_, %ebx
-#if USE___THREAD
- movl %gs:0, %edx
- subl errno@gottpoff(%ebx), %edx
- movl $EINVAL, (%edx)
-#else
- call __errno_location@plt
- movl $EAGAIN, (%eax)
-#endif
-
- orl $-1, %eax
- popl %ebx
- popl %esi
- ret
- .size __new_sem_post,.-__new_sem_post
- .symver __new_sem_post, sem_post@@GLIBC_2.1
-#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
- .global __old_sem_post
-__old_sem_post = __new_sem_post
- .symver __old_sem_post, sem_post@GLIBC_2.0
-#endif
-
-
-#ifdef PIC
- .section .gnu.linkonce.t.__i686.get_pc_thunk.bx,"ax",@progbits
- .globl __i686.get_pc_thunk.bx
- .hidden __i686.get_pc_thunk.bx
- .type __i686.get_pc_thunk.bx,@function
-__i686.get_pc_thunk.bx:
- movl (%esp), %ebx;
- ret
- .size __i686.get_pc_thunk.bx,.-__i686.get_pc_thunk.bx
-
-
- .section .gnu.linkonce.t.__i686.get_pc_thunk.cx,"ax",@progbits
- .globl __i686.get_pc_thunk.cx
- .hidden __i686.get_pc_thunk.cx
- .type __i686.get_pc_thunk.cx,@function
-__i686.get_pc_thunk.cx:
- movl (%esp), %ecx;
- ret
- .size __i686.get_pc_thunk.cx,.-__i686.get_pc_thunk.cx
-#endif
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S
new file mode 100644
index 0000000000..47ae4fa35a
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S
@@ -0,0 +1,158 @@
+/* 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 <lowlevelrwlock.h>
+
+
+#define SYS_futex 240
+#define FUTEX_WAIT 0
+#define FUTEX_WAKE 1
+
+#define EAGAIN 11
+#define EDEADLK 35
+
+#ifndef UP
+# define LOCK lock
+#else
+# define LOCK
+#endif
+
+
+ .text
+
+ .globl __pthread_rwlock_rdlock
+ .type __pthread_rwlock_rdlock,@function
+ .align 16
+__pthread_rwlock_rdlock:
+ pushl %esi
+ pushl %ebx
+
+ xorl %esi, %esi
+ xorl %edx, %edx
+ movl 12(%esp), %ebx
+
+ /* Get the lock. */
+ movl $1, %eax
+ LOCK
+#if MUTEX == 0
+ xaddl %eax, (%ebx)
+#else
+ xaddl %eax, MUTEX(%ebx)
+#endif
+ testl %eax, %eax
+ jne 1f
+
+2: movl WRITER(%ebx), %eax
+ testl %eax, %eax
+ jne 14f
+ cmp $0, WRITERS_QUEUED(%ebx)
+ je 5f
+ cmpl $0, FLAGS(%ebx)
+ je 5f
+
+3: incl READERS_QUEUED(%ebx)
+ je 4f
+
+ LOCK
+#if MUTEX == 0
+ decl (%ebx)
+#else
+ decl MUTEX(%ebx)
+#endif
+ jne 10f
+
+11: addl $READERS_WAKEUP-MUTEX, %ebx
+ movl %esi, %ecx /* movl $FUTEX_WAIT, %ecx */
+ movl $SYS_futex, %eax
+ ENTER_KERNEL
+
+ subl $READERS_WAKEUP-MUTEX, %ebx
+
+ /* Reget the lock. */
+ movl $1, %eax
+ LOCK
+#if MUTEX == 0
+ xaddl %eax, (%ebx)
+#else
+ xaddl %eax, MUTEX(%ebx)
+#endif
+ testl %eax, %eax
+ jne 12f
+
+13: decl READERS_QUEUED(%ebx)
+ jne 2b
+ movl $0, READERS_WAKEUP(%ebx)
+ jmp 2b
+
+5: xorl %ecx, %ecx
+ incl NR_READERS(%ebx)
+ je 8f
+9: LOCK
+#if MUTEX == 0
+ decl (%ebx)
+#else
+ decl MUTEX(%ebx)
+#endif
+ jne 6f
+7:
+
+ movl %ecx, %eax
+ popl %ebx
+ popl %esi
+ ret
+
+1: movl %ebx, %ecx
+ call __lll_mutex_lock_wait
+ jmp 2b
+
+14: cmpl %gs:8, %eax
+ jne 3b
+ /* Deadlock detected. */
+ movl $EDEADLK, %ecx
+ jmp 9b
+
+6: movl %ebx, %eax
+ call __lll_mutex_unlock_wake
+ jmp 7b
+
+ /* Overflow. */
+8: decl NR_READERS(%ebx)
+ movl $EAGAIN, %ecx
+ jmp 9b
+
+ /* Overflow. */
+4: decl READERS_QUEUED(%ebx)
+ movl $EAGAIN, %ecx
+ jmp 9b
+
+10: movl %ebx, %eax
+ call __lll_mutex_unlock_wake
+ jmp 11b
+
+12: movl %ebx, %ecx
+ call __lll_mutex_lock_wait
+ jmp 13b
+ .size __pthread_rwlock_rdlock,.-__pthread_rwlock_rdlock
+
+ .globl pthread_rwlock_rdlock
+pthread_rwlock_rdlock = __pthread_rwlock_rdlock
+
+ .globl __pthread_rwlock_rdlock_internal
+__pthread_rwlock_rdlock_internal = __pthread_rwlock_rdlock
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S
new file mode 100644
index 0000000000..2e99ac669a
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S
@@ -0,0 +1,192 @@
+/* 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 <lowlevelrwlock.h>
+
+
+#define SYS_gettimeofday __NR_gettimeofday
+#define SYS_futex 240
+#define FUTEX_WAIT 0
+#define FUTEX_WAKE 1
+
+#define EAGAIN 11
+#define EDEADLK 35
+#define ETIMEDOUT 110
+
+#ifndef UP
+# define LOCK lock
+#else
+# define LOCK
+#endif
+
+
+ .text
+
+ .globl pthread_rwlock_timedrdlock
+ .type pthread_rwlock_timedrdlock,@function
+ .align 16
+pthread_rwlock_timedrdlock:
+ pushl %esi
+ pushl %edi
+ pushl %ebx
+ pushl %ebp
+ subl $8, %esp
+
+ movl 28(%esp), %ebp
+ movl 32(%esp), %edi
+
+ /* Get the lock. */
+ movl $1, %eax
+ LOCK
+#if MUTEX == 0
+ xaddl %eax, (%ebp)
+#else
+ xaddl %eax, MUTEX(%ebp)
+#endif
+ testl %eax, %eax
+ jne 1f
+
+2: movl WRITER(%ebp), %eax
+ testl %eax, %eax
+ jne 14f
+ cmp $0, WRITERS_QUEUED(%ebp)
+ je 5f
+ cmpl $0, FLAGS(%ebp)
+ je 5f
+
+3: incl READERS_QUEUED(%ebp)
+ je 4f
+
+ LOCK
+#if MUTEX == 0
+ decl (%ebp)
+#else
+ decl MUTEX(%ebp)
+#endif
+ jne 10f
+
+ /* Get current time. */
+11: movl %esp, %ebx
+ xorl %ecx, %ecx
+ movl $SYS_gettimeofday, %eax
+ ENTER_KERNEL
+
+ /* Compute relative timeout. */
+ movl 4(%esp), %eax
+ movl $1000, %edx
+ mul %edx /* Milli seconds to nano seconds. */
+ movl (%edi), %ecx
+ movl 4(%edi), %edx
+ subl (%esp), %ecx
+ subl %eax, %edx
+ jns 15f
+ addl $1000000000, %edx
+ decl %ecx
+15: testl %ecx, %ecx
+ js 16f /* Time is already up. */
+
+ /* Futex call. */
+ movl %ecx, (%esp) /* Store relative timeout. */
+ movl %edx, 4(%esp)
+ xorl %ecx, %ecx /* movl $FUTEX_WAIT, %ecx */
+ movl %esp, %esi
+ movl %ecx, %edx
+ leal READERS_WAKEUP(%ebp), %ebx
+ movl $SYS_futex, %eax
+ ENTER_KERNEL
+ movl %eax, %edx
+17:
+
+ /* Reget the lock. */
+ movl $1, %eax
+ LOCK
+#if MUTEX == 0
+ xaddl %eax, (%ebp)
+#else
+ xaddl %eax, MUTEX(%ebp)
+#endif
+ testl %eax, %eax
+ jne 12f
+
+13: cmpl $-ETIMEDOUT, %ecx
+ je 18f
+ decl READERS_QUEUED(%ebp)
+ jne 2b
+ movl $0, READERS_WAKEUP(%ebp)
+ jmp 2b
+
+
+5: xorl %ecx, %ecx
+ incl NR_READERS(%ebp)
+ je 8f
+9: LOCK
+#if MUTEX == 0
+ decl (%ebp)
+#else
+ decl MUTEX(%ebp)
+#endif
+ jne 6f
+
+7: movl %ecx, %eax
+
+ addl $8, %esp
+ popl %ebp
+ popl %ebx
+ popl %edi
+ popl %esi
+ ret
+
+1: movl %ebp, %ecx
+ call __lll_mutex_lock_wait
+ jmp 2b
+
+14: cmpl %gs:8, %eax
+ jne 3b
+ movl $EDEADLK, %ecx
+ jmp 9b
+
+6: movl %ebp, %eax
+ call __lll_mutex_unlock_wake
+ jmp 7b
+
+ /* Overflow. */
+8: decl NR_READERS(%ebp)
+ movl $EAGAIN, %ecx
+ jmp 9b
+
+ /* Overflow. */
+4: decl READERS_QUEUED(%ebp)
+ movl $EAGAIN, %ecx
+ jmp 9b
+
+10: movl %ebp, %eax
+ call __lll_mutex_unlock_wake
+ jmp 11b
+
+12: movl %ebx, %ecx
+ call __lll_mutex_lock_wait
+ jmp 13b
+
+16: movl $-ETIMEDOUT, %ecx
+ jmp 17b
+
+18: movl $ETIMEDOUT, %ecx
+ jmp 9b
+ .size pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S
new file mode 100644
index 0000000000..bf8f1d48db
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S
@@ -0,0 +1,184 @@
+/* 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 <lowlevelrwlock.h>
+
+
+#define SYS_gettimeofday __NR_gettimeofday
+#define SYS_futex 240
+#define FUTEX_WAIT 0
+#define FUTEX_WAKE 1
+
+#define EAGAIN 11
+#define EDEADLK 35
+#define ETIMEDOUT 110
+
+#ifndef UP
+# define LOCK lock
+#else
+# define LOCK
+#endif
+
+
+ .text
+
+ .globl pthread_rwlock_timedwrlock
+ .type pthread_rwlock_timedwrlock,@function
+ .align 16
+pthread_rwlock_timedwrlock:
+ pushl %esi
+ pushl %edi
+ pushl %ebx
+ pushl %ebp
+ subl $8, %esp
+
+ movl 28(%esp), %ebp
+ movl 32(%esp), %edi
+
+ /* Get the lock. */
+ movl $1, %eax
+ LOCK
+#if MUTEX == 0
+ xaddl %eax, (%ebp)
+#else
+ xaddl %eax, MUTEX(%ebp)
+#endif
+ testl %eax, %eax
+ jne 1f
+
+2: movl WRITER(%ebp), %eax
+ testl %eax, %eax
+ jne 14f
+ cmp $0, NR_READERS(%ebp)
+ je 5f
+
+3: incl WRITERS_QUEUED(%ebp)
+ je 4f
+
+ LOCK
+#if MUTEX == 0
+ decl (%ebp)
+#else
+ decl MUTEX(%ebp)
+#endif
+ jne 10f
+
+ /* Get current time. */
+11: movl %esp, %ebx
+ xorl %ecx, %ecx
+ movl $SYS_gettimeofday, %eax
+ ENTER_KERNEL
+
+ /* Compute relative timeout. */
+ movl 4(%esp), %eax
+ movl $1000, %edx
+ mul %edx /* Milli seconds to nano seconds. */
+ movl (%edi), %ecx
+ movl 4(%edi), %edx
+ subl (%esp), %ecx
+ subl %eax, %edx
+ jns 15f
+ addl $1000000000, %edx
+ decl %ecx
+15: testl %ecx, %ecx
+ js 16f /* Time is already up. */
+
+ /* Futex call. */
+ movl %ecx, (%esp) /* Store relative timeout. */
+ movl %edx, 4(%esp)
+ xorl %ecx, %ecx /* movl $FUTEX_WAIT, %ecx */
+ movl %esp, %esi
+ movl %ecx, %edx
+ leal WRITERS_WAKEUP(%ebp), %ebx
+ movl $SYS_futex, %eax
+ ENTER_KERNEL
+ movl %eax, %edx
+17:
+
+ /* Reget the lock. */
+ movl $1, %eax
+ LOCK
+#if MUTEX == 0
+ xaddl %eax, (%ebp)
+#else
+ xaddl %eax, MUTEX(%ebp)
+#endif
+ testl %eax, %eax
+ jne 12f
+
+13: cmpl $-ETIMEDOUT, %ecx
+ je 18f
+ decl WRITERS_QUEUED(%ebp)
+ movl $0, WRITERS_WAKEUP(%ebp)
+ jmp 2b
+
+
+5: xorl %ecx, %ecx
+ movl %gs:8, %eax
+ movl %eax, WRITER(%ebp)
+9: LOCK
+#if MUTEX == 0
+ decl (%ebp)
+#else
+ decl MUTEX(%ebp)
+#endif
+ jne 6f
+
+7: movl %ecx, %eax
+
+ addl $8, %esp
+ popl %ebp
+ popl %ebx
+ popl %edi
+ popl %esi
+ ret
+
+1: movl %ebp, %ecx
+ call __lll_mutex_lock_wait
+ jmp 2b
+
+14: cmpl %gs:8, %eax
+ jne 3b
+ movl $EDEADLK, %ecx
+ jmp 9b
+
+6: movl %ebp, %eax
+ call __lll_mutex_unlock_wake
+ jmp 7b
+
+ /* Overflow. */
+4: decl WRITERS_QUEUED(%ebp)
+ movl $EAGAIN, %ecx
+ jmp 9b
+
+10: movl %ebp, %eax
+ call __lll_mutex_unlock_wake
+ jmp 11b
+
+12: movl %ebx, %ecx
+ call __lll_mutex_lock_wait
+ jmp 13b
+
+16: movl $-ETIMEDOUT, %ecx
+ jmp 17b
+
+18: movl $ETIMEDOUT, %ecx
+ jmp 9b
+ .size pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S
new file mode 100644
index 0000000000..829604662e
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S
@@ -0,0 +1,112 @@
+/* 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 <lowlevelrwlock.h>
+
+
+#define SYS_futex 240
+#define FUTEX_WAIT 0
+#define FUTEX_WAKE 1
+
+#ifndef UP
+# define LOCK lock
+#else
+# define LOCK
+#endif
+
+
+ .text
+
+ .globl __pthread_rwlock_unlock
+ .type __pthread_rwlock_unlock,@function
+ .align 16
+__pthread_rwlock_unlock:
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+
+ xorl %esi, %esi
+ xorl %edx, %edx
+ movl 16(%esp), %edi
+
+ /* Get the lock. */
+ movl $1, %eax
+ LOCK
+#if MUTEX == 0
+ xaddl %eax, (%edi)
+#else
+ xaddl %eax, MUTEX(%edi)
+#endif
+ testl %eax, %eax
+ jne 1f
+
+2: cmpl $0, WRITER(%edi)
+ jne 5f
+ decl NR_READERS(%edi)
+ jnz 6f
+
+5: movl $0, WRITER(%edi)
+
+ movl $0x7fffffff, %edx
+ leal READERS_WAKEUP(%edi), %ebx
+ movl $1, %ecx
+ leal WRITERS_WAKEUP(%edi), %eax
+ cmpl $0, WRITERS_QUEUED(%edi)
+#ifdef HAVE_CMOV
+ cmovnel %ecx, %edx
+ cmovnel %eax, %ebx
+#else
+ je 0f
+ movl %ecx, %edx
+ movl %eax, %ebx
+0:
+#endif
+ movl $SYS_futex, %eax
+ ENTER_KERNEL
+
+6: LOCK
+#if MUTEX == 0
+ decl (%edi)
+#else
+ decl MUTEX(%edi)
+#endif
+ jne 3f
+
+4: xorl %eax, %eax
+ popl %edi
+ popl %esi
+ popl %ebx
+ ret
+
+1: movl %edi, %ecx
+ call __lll_mutex_lock_wait
+ jmp 2b
+
+3: movl %edi, %eax
+ call __lll_mutex_unlock_wake
+ jmp 4b
+
+ .size __pthread_rwlock_unlock,.-__pthread_rwlock_unlock
+
+ .globl pthread_rwlock_unlock
+pthread_rwlock_unlock = __pthread_rwlock_unlock
+
+ .globl __pthread_rwlock_unlock_internal
+__pthread_rwlock_unlock_internal = __pthread_rwlock_unlock
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S
new file mode 100644
index 0000000000..ff3960960d
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S
@@ -0,0 +1,148 @@
+/* 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 <lowlevelrwlock.h>
+
+
+#define SYS_futex 240
+#define FUTEX_WAIT 0
+#define FUTEX_WAKE 1
+
+#define EAGAIN 11
+#define EDEADLK 35
+
+#ifndef UP
+# define LOCK lock
+#else
+# define LOCK
+#endif
+
+
+ .text
+
+ .globl __pthread_rwlock_wrlock
+ .type __pthread_rwlock_wrlock,@function
+ .align 16
+__pthread_rwlock_wrlock:
+ pushl %esi
+ pushl %ebx
+
+ xorl %esi, %esi
+ xorl %edx, %edx
+ movl 12(%esp), %ebx
+
+ /* Get the lock. */
+ movl $1, %eax
+ LOCK
+#if MUTEX == 0
+ xaddl %eax, (%ebx)
+#else
+ xaddl %eax, MUTEX(%ebx)
+#endif
+ testl %eax, %eax
+ jne 1f
+
+2: movl WRITER(%ebx), %eax
+ testl %eax, %eax
+ jne 14f
+ cmp $0, NR_READERS(%ebx)
+ je 5f
+
+3: incl WRITERS_QUEUED(%ebx)
+ je 4f
+
+ LOCK
+#if MUTEX == 0
+ decl (%ebx)
+#else
+ decl MUTEX(%ebx)
+#endif
+ jne 10f
+
+11: addl $WRITERS_WAKEUP-MUTEX, %ebx
+ movl %esi, %ecx /* movl $FUTEX_WAIT, %ecx */
+ movl $SYS_futex, %eax
+ ENTER_KERNEL
+
+ subl $WRITERS_WAKEUP-MUTEX, %ebx
+
+ /* Reget the lock. */
+ movl $1, %eax
+ LOCK
+#if MUTEX == 0
+ xaddl %eax, (%ebx)
+#else
+ xaddl %eax, MUTEX(%ebx)
+#endif
+ testl %eax, %eax
+ jne 12f
+
+13: decl WRITERS_QUEUED(%ebx)
+ movl $0, WRITERS_WAKEUP(%ebx)
+ jmp 2b
+
+5: xorl %ecx, %ecx
+ movl %gs:8, %eax
+ movl %eax, WRITER(%ebx)
+9: LOCK
+#if MUTEX == 0
+ decl (%ebx)
+#else
+ decl MUTEX(%ebx)
+#endif
+ jne 6f
+7:
+
+ movl %ecx, %eax
+ popl %ebx
+ popl %esi
+ ret
+
+1: movl %ebx, %ecx
+ call __lll_mutex_lock_wait
+ jmp 2b
+
+14: cmpl %gs:8, %eax
+ jne 3b
+ movl $EDEADLK, %ecx
+ jmp 9b
+
+6: movl %ebx, %eax
+ call __lll_mutex_unlock_wake
+ jmp 7b
+
+4: decl WRITERS_QUEUED(%ebx)
+ movl $EAGAIN, %ecx
+ jmp 9b
+
+10: movl %ebx, %eax
+ call __lll_mutex_unlock_wake
+ jmp 11b
+
+12: movl %ebx, %ecx
+ call __lll_mutex_lock_wait
+ jmp 13b
+ .size __pthread_rwlock_wrlock,.-__pthread_rwlock_wrlock
+
+ .globl pthread_rwlock_wrlock
+pthread_rwlock_wrlock = __pthread_rwlock_wrlock
+
+ .globl __pthread_rwlock_wrlock_internal
+__pthread_rwlock_wrlock_internal = __pthread_rwlock_wrlock
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelrwlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_rdlock.S
index 6f4a8305ee..da2bc4704e 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelrwlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_rdlock.S
@@ -1,6 +1,6 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -17,4 +17,4 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#include "../i486/lowlevelrwlock.S"
+#include "../i486/pthread_rwlock_rdlock.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S
new file mode 100644
index 0000000000..0f2ec168b8
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S
@@ -0,0 +1,20 @@
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
+
+ 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 "../i486/pthread_rwlock_timedrdlock.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S
new file mode 100644
index 0000000000..26501590a5
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S
@@ -0,0 +1,20 @@
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
+
+ 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 "../i486/pthread_rwlock_timedwrlock.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelsem.S b/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_unlock.S
index cfaa36ac74..5515e4895d 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelsem.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_unlock.S
@@ -1,6 +1,6 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -17,4 +17,4 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#include "../i486/lowlevelsem.S"
+#include "../i486/pthread_rwlock_unlock.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelcond.S b/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_wrlock.S
index 3dc8403a29..04ac275f60 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelcond.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_wrlock.S
@@ -1,6 +1,6 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -17,4 +17,4 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#include "../i486/lowlevelcond.S"
+#include "../i486/pthread_rwlock_wrlock.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelsem.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelsem.S
deleted file mode 100644
index cfaa36ac74..0000000000
--- a/nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelsem.S
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Copyright (C) 2002 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 "../i486/lowlevelsem.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelcond.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_rdlock.S
index 3dc8403a29..da2bc4704e 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelcond.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_rdlock.S
@@ -1,6 +1,6 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -17,4 +17,4 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#include "../i486/lowlevelcond.S"
+#include "../i486/pthread_rwlock_rdlock.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S
new file mode 100644
index 0000000000..0f2ec168b8
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S
@@ -0,0 +1,20 @@
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
+
+ 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 "../i486/pthread_rwlock_timedrdlock.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S
new file mode 100644
index 0000000000..26501590a5
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S
@@ -0,0 +1,20 @@
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
+
+ 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 "../i486/pthread_rwlock_timedwrlock.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelrwlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_unlock.S
index cc47163957..0894f05467 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelrwlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_unlock.S
@@ -1,6 +1,6 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -18,4 +18,4 @@
02111-1307 USA. */
#define HAVE_CMOV 1
-#include "../i486/lowlevelrwlock.S"
+#include "../i486/pthread_rwlock_unlock.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S
new file mode 100644
index 0000000000..04ac275f60
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S
@@ -0,0 +1,20 @@
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
+
+ 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 "../i486/pthread_rwlock_wrlock.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/lowlevelrwlock.h b/nptl/sysdeps/unix/sysv/linux/i386/lowlevelrwlock.h
new file mode 100644
index 0000000000..4357e80a0b
--- /dev/null
+++ b/nptl/sysdeps/unix/sysv/linux/i386/lowlevelrwlock.h
@@ -0,0 +1,28 @@
+/* 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. */
+
+/* Offsets in the pthread_rwlock_t structure. */
+#define MUTEX 0
+#define NR_READERS 4
+#define READERS_WAKEUP 8
+#define WRITERS_WAKEUP 12
+#define READERS_QUEUED 16
+#define WRITERS_QUEUED 20
+#define FLAGS 24
+#define WRITER 28