Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 29 Jan 2003 00:39:03 +0000 (00:39 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 29 Jan 2003 00:39:03 +0000 (00:39 +0000)
* 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.

22 files changed:
nptl/ChangeLog
nptl/Makefile
nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S [deleted file]
nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S [deleted file]
nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelsem.S [deleted file]
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_rdlock.S [moved from nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelrwlock.S with 83% similarity]
nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_unlock.S [moved from nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelsem.S with 83% similarity]
nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_wrlock.S [moved from nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelcond.S with 83% similarity]
nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelsem.S [deleted file]
nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_rdlock.S [moved from nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelcond.S with 83% similarity]
nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_unlock.S [moved from nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelrwlock.S with 83% similarity]
nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/lowlevelrwlock.h [new file with mode: 0644]

index 94e0eb6..26bbedd 100644 (file)
@@ -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,
index 3409a93..507e1f8 100644 (file)
@@ -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 (file)
index 83a4fb3..0000000
+++ /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 (file)
index cc2885e..0000000
+++ /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 (file)
index 1e32ec0..0000000
+++ /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 (file)
index 0000000..47ae4fa
--- /dev/null
@@ -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 (file)
index 0000000..2e99ac6
--- /dev/null
@@ -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 (file)
index 0000000..bf8f1d4
--- /dev/null
@@ -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 (file)
index 0000000..8296046
--- /dev/null
@@ -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 (file)
index 0000000..ff39609
--- /dev/null
@@ -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
@@ -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 (file)
index 0000000..0f2ec16
--- /dev/null
@@ -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 (file)
index 0000000..2650159
--- /dev/null
@@ -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"
@@ -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"
@@ -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 (file)
index cfaa36a..0000000
+++ /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"
@@ -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 (file)
index 0000000..0f2ec16
--- /dev/null
@@ -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 (file)
index 0000000..2650159
--- /dev/null
@@ -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"
@@ -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 (file)
index 0000000..04ac275
--- /dev/null
@@ -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 (file)
index 0000000..4357e80
--- /dev/null
@@ -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