From 6cf26f4168aef852d7fa4106b59af1a7fc40c650 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 29 Jan 2003 00:39:03 +0000 Subject: [PATCH] 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. --- nptl/ChangeLog | 29 + nptl/Makefile | 5 +- .../unix/sysv/linux/i386/i486/lowlevelcond.S | 668 ------------------ .../sysv/linux/i386/i486/lowlevelrwlock.S | 654 ----------------- .../unix/sysv/linux/i386/i486/lowlevelsem.S | 334 --------- .../linux/i386/i486/pthread_rwlock_rdlock.S | 158 +++++ .../i386/i486/pthread_rwlock_timedrdlock.S | 192 +++++ .../i386/i486/pthread_rwlock_timedwrlock.S | 184 +++++ .../linux/i386/i486/pthread_rwlock_unlock.S | 112 +++ .../linux/i386/i486/pthread_rwlock_wrlock.S | 148 ++++ ...wlevelrwlock.S => pthread_rwlock_rdlock.S} | 6 +- .../i386/i586/pthread_rwlock_timedrdlock.S | 20 + .../i386/i586/pthread_rwlock_timedwrlock.S | 20 + ...{lowlevelsem.S => pthread_rwlock_unlock.S} | 6 +- .../pthread_rwlock_wrlock.S} | 6 +- .../unix/sysv/linux/i386/i686/lowlevelsem.S | 20 - .../pthread_rwlock_rdlock.S} | 6 +- .../i386/i686/pthread_rwlock_timedrdlock.S | 20 + .../i386/i686/pthread_rwlock_timedwrlock.S | 20 + ...wlevelrwlock.S => pthread_rwlock_unlock.S} | 6 +- .../linux/i386/i686/pthread_rwlock_wrlock.S | 20 + .../unix/sysv/linux/i386/lowlevelrwlock.h | 28 + 22 files changed, 970 insertions(+), 1692 deletions(-) delete mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S delete mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelsem.S create mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S create mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S create mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S create mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S create mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S rename nptl/sysdeps/unix/sysv/linux/i386/i586/{lowlevelrwlock.S => pthread_rwlock_rdlock.S} (83%) create mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S create mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S rename nptl/sysdeps/unix/sysv/linux/i386/i586/{lowlevelsem.S => pthread_rwlock_unlock.S} (83%) rename nptl/sysdeps/unix/sysv/linux/i386/{i686/lowlevelcond.S => i586/pthread_rwlock_wrlock.S} (83%) delete mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelsem.S rename nptl/sysdeps/unix/sysv/linux/i386/{i586/lowlevelcond.S => i686/pthread_rwlock_rdlock.S} (83%) create mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S create mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S rename nptl/sysdeps/unix/sysv/linux/i386/i686/{lowlevelrwlock.S => pthread_rwlock_unlock.S} (83%) create mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S create mode 100644 nptl/sysdeps/unix/sysv/linux/i386/lowlevelrwlock.h 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 + * 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 , 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 -#include - -#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 , 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 - - .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 , 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 -#include - - .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 , 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 +#include + + +#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 , 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 +#include + + +#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 , 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 +#include + + +#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 , 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 +#include + + +#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 , 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 +#include + + +#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 similarity index 83% rename from nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelrwlock.S rename to 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 , 2002. + Contributed by Ulrich Drepper , 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 , 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 , 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 similarity index 83% rename from nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelsem.S rename to 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 , 2002. + Contributed by Ulrich Drepper , 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 similarity index 83% rename from nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelcond.S rename to 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 , 2002. + Contributed by Ulrich Drepper , 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 , 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 similarity index 83% rename from nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelcond.S rename to 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 , 2002. + Contributed by Ulrich Drepper , 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 , 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 , 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 similarity index 83% rename from nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelrwlock.S rename to 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 , 2002. + Contributed by Ulrich Drepper , 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 , 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 , 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