Update.
authorUlrich Drepper <drepper@redhat.com>
Fri, 13 Feb 2004 08:04:27 +0000 (08:04 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 13 Feb 2004 08:04:27 +0000 (08:04 +0000)
2004-02-13  Ulrich Drepper  <drepper@redhat.com>

* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
(__pthread_cond_timedwait): Get internal lock in case timeout has
passed before the futex syscall.
* sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise.

nptl/ChangeLog
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S

index ef9aa2d..351ff05 100644 (file)
@@ -1,3 +1,10 @@
+2004-02-13  Ulrich Drepper  <drepper@redhat.com>
+
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
+       (__pthread_cond_timedwait): Get internal lock in case timeout has
+       passed before the futex syscall.
+       * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise.
+
 2004-01-20  Ulrich Drepper  <drepper@redhat.com>
 
        * allocatestack.c: Pretty printing.
index 06ad11c..1783095 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -202,8 +202,20 @@ __pthread_cond_timedwait:
 
 15:    cmpl    $-ETIMEDOUT, %esi
        jne     8b
+       jmp     24f
 
-13:    addl    $1, wakeup_seq(%ebx)
+       /* Lock.  */
+13:    movl    $1, %edx
+       xorl    %eax, %eax
+       LOCK
+#if cond_lock == 0
+       cmpxchgl %edx, (%ebx)
+#else
+       cmpxchgl %edx, cond_lock(%ebx)
+#endif
+       jnz     23f
+
+24:    addl    $1, wakeup_seq(%ebx)
        adcl    $0, wakeup_seq+4(%ebx)
        movl    $ETIMEDOUT, %esi
        jmp     14f
@@ -335,6 +347,16 @@ __pthread_cond_timedwait:
        js      13b
        jmp     21b
 #endif
+
+       /* Locking after time elapsed failed.  */
+23:
+#if cond_lock == 0
+       movl    %ebx, %ecx
+#else
+       leal    cond_lock(%ebx), %ecx
+#endif
+       call    __lll_mutex_lock_wait
+       jmp     24b
        .size   __pthread_cond_timedwait, .-__pthread_cond_timedwait
 versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait,
                  GLIBC_2_3_2)
index e001441..cd5d647 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -212,8 +212,21 @@ __pthread_cond_timedwait:
 
 15:    cmpq    $-ETIMEDOUT, %r14
        jne     8b
+       jmp     24f
 
-13:    incq    wakeup_seq(%rdi)
+       /* Lock.  */
+13:    movq    8(%rsp), %rdi
+       movl    $1, %esi
+       xorl    %eax, %eax
+       LOCK
+#if cond_lock == 0
+       cmpxchgl %esi, (%rdi)
+#else
+       cmpxchgl %esi, cond_lock(%rdi)
+#endif
+       jne     23f
+
+24:    incq    wakeup_seq(%rdi)
        movq    $ETIMEDOUT, %r14
        jmp     14f
 
@@ -327,6 +340,17 @@ __pthread_cond_timedwait:
        js      13b
        jmp     21b
 #endif
+
+       /* Locking after time elapsed failed.  */
+23:
+#if cond_lock != 0
+       addq    $cond_lock, %rdi
+#endif
+       callq   __lll_mutex_lock_wait
+#if cond_lock != 0
+       subq    $cond_lock, %rdi
+#endif
+       jmp     24b
 .LENDCODE:
        .size   __pthread_cond_timedwait, .-__pthread_cond_timedwait
 versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait,