Fix pthread_cond_*wait with requeue-PI on i386.
authorMichal Schmidt <mschmidt@redhat.com>
Sat, 16 Jan 2010 02:09:14 +0000 (18:09 -0800)
committerUlrich Drepper <drepper@redhat.com>
Sat, 16 Jan 2010 02:09:14 +0000 (18:09 -0800)
nptl/ChangeLog
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S

index e4185e0..c81eb03 100644 (file)
@@ -1,3 +1,16 @@
+2010-01-15  Ulrich Drepper  <drepper@redhat.com>
+
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S:
+       Fix unwind info.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise.
+
+2010-01-15  Michal Schmidt  <mschmidt@redhat.com>
+
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S:
+       Fix pthread_cond_timedwait with requeue-PI.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S:
+       Fix pthread_cond_wait with requeue-PI.
+
 2010-01-14  Ulrich Drepper  <drepper@redhat.com>
 
        * Versions: Add pthread_mutex_consistent, pthread_mutexattr_getrobust,
index 218762a..dee73f0 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002-2004, 2006-2007, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2004,2006-2007,2009,2010 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -57,7 +57,6 @@ __pthread_cond_timedwait:
        pushl   %ebx
        cfi_adjust_cfa_offset(4)
        cfi_rel_offset(%ebx, 0)
-       cfi_remember_state
 
        movl    20(%esp), %ebx
        movl    28(%esp), %ebp
@@ -99,6 +98,7 @@ __pthread_cond_timedwait:
 #define FRAME_SIZE 32
        subl    $FRAME_SIZE, %esp
        cfi_adjust_cfa_offset(FRAME_SIZE)
+       cfi_remember_state
 
        /* Get and store current wakeup_seq value.  */
        movl    wakeup_seq(%ebx), %edi
@@ -326,14 +326,12 @@ __pthread_cond_timedwait:
 #endif
        jne     10f
 
-11:    xorl    %eax, %eax
+11:    movl    24+FRAME_SIZE(%esp), %eax
        /* With requeue_pi, the mutex lock is held in the kernel.  */
        movl    24(%esp), %ecx
        testl   %ecx, %ecx
-       jnz     26f
+       jnz     27f
 
-       /* Remove cancellation handler.  */
-       movl    24+FRAME_SIZE(%esp), %eax
        call    __pthread_mutex_cond_lock
 26:    addl    $FRAME_SIZE, %esp
        cfi_adjust_cfa_offset(-FRAME_SIZE);
@@ -366,8 +364,10 @@ __pthread_cond_timedwait:
        cfi_restore_state
 
 27:    call    __pthread_mutex_cond_lock_adjust
+       xorl    %eax, %eax
        jmp     26b
 
+       cfi_adjust_cfa_offset(-FRAME_SIZE);
        /* Initial locking failed.  */
 1:
 #if cond_lock == 0
index b3b8bc4..53970d7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002-2004, 2006-2007, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2004,2006-2007,2009,2010 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -57,7 +57,6 @@ __pthread_cond_wait:
        pushl   %ebx
        cfi_adjust_cfa_offset(4)
        cfi_rel_offset(%ebx, 0)
-       cfi_remember_state
 
        xorl    %esi, %esi
        movl    20(%esp), %ebx
@@ -95,6 +94,7 @@ __pthread_cond_wait:
 #define FRAME_SIZE 20
        subl    $FRAME_SIZE, %esp
        cfi_adjust_cfa_offset(FRAME_SIZE)
+       cfi_remember_state
 
        /* Get and store current wakeup_seq value.  */
        movl    wakeup_seq(%ebx), %edi
@@ -247,12 +247,11 @@ __pthread_cond_wait:
        jne     10f
 
        /* With requeue_pi, the mutex lock is held in the kernel.  */
-11:    xorl    %eax, %eax
+11:    movl    24+FRAME_SIZE(%esp), %eax
        movl    16(%esp), %ecx
        testl   %ecx, %ecx
-       jnz     20f
+       jnz     21f
 
-       movl    24+FRAME_SIZE(%esp), %eax
        call    __pthread_mutex_cond_lock
 20:    addl    $FRAME_SIZE, %esp
        cfi_adjust_cfa_offset(-FRAME_SIZE);
@@ -279,6 +278,7 @@ __pthread_cond_wait:
        xorl    %eax, %eax
        jmp     20b
 
+       cfi_adjust_cfa_offset(-FRAME_SIZE);
        /* Initial locking failed.  */
 1:
 #if cond_lock == 0