Update.
authorUlrich Drepper <drepper@redhat.com>
Tue, 28 Jan 2003 23:52:31 +0000 (23:52 +0000)
committerUlrich Drepper <drepper@redhat.com>
Tue, 28 Jan 2003 23:52:31 +0000 (23:52 +0000)
* 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,
and pthread_cond_broadcast.
* sysdeps/unix/sysv/linux/i486/lowlevelsem.S: Removed
* sysdeps/unix/sysv/linux/i486/lowlevelcond.S: Removed
* sysdeps/unix/sysv/linux/i586/lowlevelsem.S: Removed
* sysdeps/unix/sysv/linux/i586/lowlevelcond.S: Removed
* sysdeps/unix/sysv/linux/i686/lowlevelsem.S: Removed
* sysdeps/unix/sysv/linux/i686/lowlevelcond.S: Removed
* sysdeps/unix/sysv/linux/i486/sem_wait.S: New file.
* sysdeps/unix/sysv/linux/i486/sem_trywait.S: New file.
* sysdeps/unix/sysv/linux/i486/sem_timedwait.S: New file.
* sysdeps/unix/sysv/linux/i486/sem_post.S: New file.
* sysdeps/unix/sysv/linux/i486/pthread_cond_wait.S: New file.
* sysdeps/unix/sysv/linux/i486/pthread_cond_timedwait.S: New file.
* sysdeps/unix/sysv/linux/i486/pthread_cond_signal.S: New file.
* sysdeps/unix/sysv/linux/i486/pthread_cond_broadcast.S: New file.
* sysdeps/unix/sysv/linux/i586/sem_wait.S: New file.
* sysdeps/unix/sysv/linux/i586/sem_trywait.S: New file.
* sysdeps/unix/sysv/linux/i586/sem_timedwait.S: New file.
* sysdeps/unix/sysv/linux/i586/sem_post.S: New file.
* sysdeps/unix/sysv/linux/i586/pthread_cond_wait.S: New file.
* sysdeps/unix/sysv/linux/i586/pthread_cond_timedwait.S: New file.
* sysdeps/unix/sysv/linux/i586/pthread_cond_signal.S: New file.
* sysdeps/unix/sysv/linux/i586/pthread_cond_broadcast.S: New file.
* sysdeps/unix/sysv/linux/i686/sem_wait.S: New file.
* sysdeps/unix/sysv/linux/i686/sem_trywait.S: New file.
* sysdeps/unix/sysv/linux/i686/sem_timedwait.S: New file.
* sysdeps/unix/sysv/linux/i686/sem_post.S: New file.
* sysdeps/unix/sysv/linux/i686/pthread_cond_wait.S: New file.
* sysdeps/unix/sysv/linux/i686/pthread_cond_timedwait.S: New file.
* sysdeps/unix/sysv/linux/i686/pthread_cond_signal.S: New file.
* sysdeps/unix/sysv/linux/i686/pthread_cond_broadcast.S: New file.

27 files changed:
nptl/Banner
nptl/ChangeLog
nptl/Makefile
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_broadcast.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_signal.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_timedwait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_wait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i586/sem_post.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i586/sem_timedwait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i586/sem_trywait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i586/sem_wait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_broadcast.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_signal.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_timedwait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_wait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i686/sem_post.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i686/sem_timedwait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i686/sem_trywait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/i386/i686/sem_wait.S [new file with mode: 0644]

index 9a3a874..5dc564b 100644 (file)
@@ -1 +1 @@
-NPTL 0.17 by Ulrich Drepper
+NPTL 0.18 by Ulrich Drepper
index 1f293f5..3125119 100644 (file)
@@ -1,5 +1,40 @@
 2003-01-28  Ulrich Drepper  <drepper@redhat.com>
 
+       * 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,
+       and pthread_cond_broadcast.
+       * sysdeps/unix/sysv/linux/i486/lowlevelsem.S: Removed
+       * sysdeps/unix/sysv/linux/i486/lowlevelcond.S: Removed
+       * sysdeps/unix/sysv/linux/i586/lowlevelsem.S: Removed
+       * sysdeps/unix/sysv/linux/i586/lowlevelcond.S: Removed
+       * sysdeps/unix/sysv/linux/i686/lowlevelsem.S: Removed
+       * sysdeps/unix/sysv/linux/i686/lowlevelcond.S: Removed
+       * sysdeps/unix/sysv/linux/i486/sem_wait.S: New file.
+       * sysdeps/unix/sysv/linux/i486/sem_trywait.S: New file.
+       * sysdeps/unix/sysv/linux/i486/sem_timedwait.S: New file.
+       * sysdeps/unix/sysv/linux/i486/sem_post.S: New file.
+       * sysdeps/unix/sysv/linux/i486/pthread_cond_wait.S: New file.
+       * sysdeps/unix/sysv/linux/i486/pthread_cond_timedwait.S: New file.
+       * sysdeps/unix/sysv/linux/i486/pthread_cond_signal.S: New file.
+       * sysdeps/unix/sysv/linux/i486/pthread_cond_broadcast.S: New file.
+       * sysdeps/unix/sysv/linux/i586/sem_wait.S: New file.
+       * sysdeps/unix/sysv/linux/i586/sem_trywait.S: New file.
+       * sysdeps/unix/sysv/linux/i586/sem_timedwait.S: New file.
+       * sysdeps/unix/sysv/linux/i586/sem_post.S: New file.
+       * sysdeps/unix/sysv/linux/i586/pthread_cond_wait.S: New file.
+       * sysdeps/unix/sysv/linux/i586/pthread_cond_timedwait.S: New file.
+       * sysdeps/unix/sysv/linux/i586/pthread_cond_signal.S: New file.
+       * sysdeps/unix/sysv/linux/i586/pthread_cond_broadcast.S: New file.
+       * sysdeps/unix/sysv/linux/i686/sem_wait.S: New file.
+       * sysdeps/unix/sysv/linux/i686/sem_trywait.S: New file.
+       * sysdeps/unix/sysv/linux/i686/sem_timedwait.S: New file.
+       * sysdeps/unix/sysv/linux/i686/sem_post.S: New file.
+       * sysdeps/unix/sysv/linux/i686/pthread_cond_wait.S: New file.
+       * sysdeps/unix/sysv/linux/i686/pthread_cond_timedwait.S: New file.
+       * sysdeps/unix/sysv/linux/i686/pthread_cond_signal.S: New file.
+       * sysdeps/unix/sysv/linux/i686/pthread_cond_broadcast.S: New file.
+
        * sysdeps/unix/sysv/linux/i386/createthread.c: Define
        PREPARE_CREATE and TLS_VALUE with x86-specific bits.  All the rest
        of the code is moved to ...
index 6ca0f91..3409a93 100644 (file)
@@ -65,6 +65,8 @@ libpthread-routines = init events version \
                      pthread_rwlockattr_getkind_np \
                      pthread_rwlockattr_setkind_np \
                      pthread_cond_init pthread_cond_destroy \
+                     pthread_cond_wait pthread_cond_timedwait \
+                     pthread_cond_signal pthread_cond_broadcast \
                      old_pthread_cond_init old_pthread_cond_destroy \
                      old_pthread_cond_wait old_pthread_cond_timedwait \
                      old_pthread_cond_signal old_pthread_cond_broadcast \
@@ -90,11 +92,11 @@ libpthread-routines = init events version \
                      sem_init sem_destroy \
                      sem_open sem_close sem_unlink \
                      sem_getvalue \
+                     sem_wait sem_trywait sem_timedwait sem_post \
                      cleanup cleanup_defer \
                      pt-longjmp \
                      cancellation \
-                     lowlevellock lowlevelmutex lowlevelcond lowlevelrwlock \
-                     lowlevelsem \
+                     lowlevellock lowlevelmutex lowlevelrwlock \
                      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/pthread_cond_broadcast.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S
new file mode 100644 (file)
index 0000000..90d2d3b
--- /dev/null
@@ -0,0 +1,119 @@
+/* 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>
+#include <lowlevelcond.h>
+
+#ifdef UP
+# define LOCK
+#else
+# define LOCK lock
+#endif
+
+#define SYS_futex              240
+#define FUTEX_WAIT             0
+#define FUTEX_WAKE             1
+
+
+       .text
+
+       /* 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)
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S
new file mode 100644 (file)
index 0000000..5067345
--- /dev/null
@@ -0,0 +1,119 @@
+/* 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>
+#include <lowlevelcond.h>
+
+#ifdef UP
+# define LOCK
+#else
+# define LOCK lock
+#endif
+
+#define SYS_futex              240
+#define FUTEX_WAIT             0
+#define FUTEX_WAKE             1
+
+
+       .text
+
+       /* 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)
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
new file mode 100644 (file)
index 0000000..7b8ec93
--- /dev/null
@@ -0,0 +1,256 @@
+/* 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>
+#include <lowlevelcond.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
+
+
+       .text
+
+/* 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)
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
new file mode 100644 (file)
index 0000000..438fcca
--- /dev/null
@@ -0,0 +1,274 @@
+/* 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>
+#include <lowlevelcond.h>
+
+#ifdef UP
+# define LOCK
+#else
+# define LOCK lock
+#endif
+
+#define SYS_futex              240
+#define FUTEX_WAIT             0
+#define FUTEX_WAKE             1
+
+
+       .text
+
+       .align  16
+       .type   __condvar_cleanup, @function
+       .globl  __condvar_cleanup
+       .hidden __condvar_cleanup
+__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)
+
+
+#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/sem_post.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S
new file mode 100644 (file)
index 0000000..8704b79
--- /dev/null
@@ -0,0 +1,103 @@
+/* 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>
+
+#ifndef UP
+# define LOCK lock
+#else
+# define
+#endif
+
+#define SYS_futex              240
+#define FUTEX_WAKE             1
+
+#define EAGAIN                 11
+#define EINVAL                 22
+
+
+       .text
+
+       .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
+#endif
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S
new file mode 100644 (file)
index 0000000..4d01b2e
--- /dev/null
@@ -0,0 +1,147 @@
+/* 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>
+
+#ifndef UP
+# define LOCK lock
+#else
+# define
+#endif
+
+#define SYS_gettimeofday       __NR_gettimeofday
+#define SYS_futex              240
+#define FUTEX_WAKE             1
+
+#define EWOULDBLOCK            11
+#define EINVAL                 22
+#define ETIMEDOUT              110
+
+
+       .text
+
+       .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
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S
new file mode 100644 (file)
index 0000000..4e93ae5
--- /dev/null
@@ -0,0 +1,90 @@
+/* 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>
+
+#ifndef UP
+# define LOCK lock
+#else
+# define
+#endif
+
+#define SYS_futex              240
+#define FUTEX_WAKE             1
+
+#define EAGAIN                 11
+
+
+       .text
+
+       .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
+
+
+#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/sem_wait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S
new file mode 100644 (file)
index 0000000..46e6f80
--- /dev/null
@@ -0,0 +1,97 @@
+/* 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>
+
+#ifndef UP
+# define LOCK lock
+#else
+# define
+#endif
+
+#define SYS_futex              240
+#define FUTEX_WAKE             1
+
+#define EWOULDBLOCK            11
+
+
+       .text
+
+       .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
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_broadcast.S b/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_broadcast.S
new file mode 100644 (file)
index 0000000..5e1024e
--- /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_cond_broadcast.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_signal.S b/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_signal.S
new file mode 100644 (file)
index 0000000..da4e8cb
--- /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_cond_signal.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_timedwait.S
new file mode 100644 (file)
index 0000000..c013155
--- /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_cond_timedwait.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_wait.S
new file mode 100644 (file)
index 0000000..9b57fba
--- /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_cond_wait.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_post.S b/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_post.S
new file mode 100644 (file)
index 0000000..7317e15
--- /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/sem_post.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_timedwait.S
new file mode 100644 (file)
index 0000000..f34539d
--- /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/sem_timedwait.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_trywait.S b/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_trywait.S
new file mode 100644 (file)
index 0000000..64145c2
--- /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/sem_trywait.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_wait.S b/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_wait.S
new file mode 100644 (file)
index 0000000..b3d4621
--- /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/sem_wait.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_broadcast.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_broadcast.S
new file mode 100644 (file)
index 0000000..5e1024e
--- /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_cond_broadcast.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_signal.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_signal.S
new file mode 100644 (file)
index 0000000..da4e8cb
--- /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_cond_signal.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_timedwait.S
new file mode 100644 (file)
index 0000000..c013155
--- /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_cond_timedwait.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_wait.S
new file mode 100644 (file)
index 0000000..9b57fba
--- /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_cond_wait.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_post.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_post.S
new file mode 100644 (file)
index 0000000..7317e15
--- /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/sem_post.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_timedwait.S
new file mode 100644 (file)
index 0000000..f34539d
--- /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/sem_timedwait.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_trywait.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_trywait.S
new file mode 100644 (file)
index 0000000..64145c2
--- /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/sem_trywait.S"
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_wait.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_wait.S
new file mode 100644 (file)
index 0000000..b3d4621
--- /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/sem_wait.S"