]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Fri, 1 Oct 2004 10:33:03 +0000 (10:33 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 1 Oct 2004 10:33:03 +0000 (10:33 +0000)
2004-10-01  Ulrich Drepper  <drepper@redhat.com>

* sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S
(__lll_mutex_timedlock_wait): I woken but cannot get the lock,
make sure 2 is stored in the futex and we looked at the old value.
* sysdeps/unix/sysv/linux/x86_64/lowlevellock.S
(__lll_mutex_timedlock_wait): Likewise.  Fix a few other problems
which might very well made the code not working at all before.

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

index 2c4526970a82bfa21416ddf0a5bb68bf8de86c14..6a6af8dd7276de020ec97e4eb2db13b7fcf5e099 100644 (file)
@@ -1,3 +1,12 @@
+2004-10-01  Ulrich Drepper  <drepper@redhat.com>
+
+       * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S
+       (__lll_mutex_timedlock_wait): I woken but cannot get the lock,
+       make sure 2 is stored in the futex and we looked at the old value.
+       * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S
+       (__lll_mutex_timedlock_wait): Likewise.  Fix a few other problems
+       which might very well made the code not working at all before.
+
 2004-09-28  Ulrich Drepper  <drepper@redhat.com>
 
        * sysdeps/unix/sysv/linux/pthread_kill.c (__pthread_kill): Don't
index 96ea35caac87ee1d56952234011189b657710c90..dc65b709a1a1194a1c41994efa2cdb030b81340e 100644 (file)
@@ -132,9 +132,8 @@ __lll_mutex_timedlock_wait:
        ENTER_KERNEL
        movl    %eax, %ecx
 
-8:
+8:                             /* NB: %edx == 2 */
        xorl    %eax, %eax
-       movl    $2, %edx
        LOCK
        cmpxchgl %edx, (%ebx)
 
@@ -150,6 +149,12 @@ __lll_mutex_timedlock_wait:
        /* Check whether the time expired.  */
 7:     cmpl    $-ETIMEDOUT, %ecx
        je      5f
+
+       /* Make sure the current holder knows we are going to sleep.  */
+       movl    %edx, %eax
+       xchgl   %eax, (%ebx)
+       testl   %eax, %eax
+       jz      6b
        jmp     1b
 
 3:     movl    $EINVAL, %eax
index cf3dad18fbc2c1be86c146cd41fb62aa0c823ad4..6827804f7fff134421e9f535d218054df1b38d6f 100644 (file)
@@ -95,7 +95,7 @@ __lll_mutex_timedlock_wait:
        movq    %rsp, %rdi
        xorq    %rsi, %rsi
        movq    $VSYSCALL_ADDR_vgettimeofday, %rax
-       /* This is a regular function call, all calleer-save registers
+       /* This is a regular function call, all caller-save registers
           might be clobbered.  */
        callq   *%rax
 
@@ -132,15 +132,13 @@ __lll_mutex_timedlock_wait:
        syscall
        movq    %rax, %rcx
 
-       movl    $1, %eax
+8:                             /* NB: %edx == 2 */
+       xorl    %eax, %eax
        LOCK
        cmpxchgl %edx, (%rdi)
        jnz     7f
 
-       movl    $2, (%rdi)
-       xorl    %eax, %eax
-
-8:     addq    $16, %rsp
+6:     addq    $16, %rsp
        popq    %r14
        popq    %r13
        popq    %r12
@@ -151,13 +149,19 @@ __lll_mutex_timedlock_wait:
        /* Check whether the time expired.  */
 7:     cmpq    $-ETIMEDOUT, %rcx
        je      5f
+
+       /* Make sure the current holder knows we are going to sleep.  */
+       movl    %edx, %eax
+       xchgl   %eax, (%ebx)
+       testl   %eax, %eax
+       jz      6b
        jmp     1b
 
 3:     movl    $EINVAL, %eax
        retq
 
 5:     movl    $ETIMEDOUT, %eax
-       jmp     8b
+       jmp     6b
        .size   __lll_mutex_timedlock_wait,.-__lll_mutex_timedlock_wait
 #endif