From 9485a404440e392dbcfdc157bbdf5c863f9c0fce Mon Sep 17 00:00:00 2001 From: Siddhesh Poyarekar Date: Tue, 16 Oct 2012 14:23:01 +0530 Subject: [PATCH] Adjust mutex lock in condvar_cleanup if we got it from requeue_pi This completes the fix to bz #14652. --- nptl/ChangeLog | 13 +++++++++++++ .../unix/sysv/linux/i386/i486/pthread_cond_timedwait.S | 5 ++++- nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S | 5 ++++- .../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S | 5 ++++- nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S | 6 +++++- 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 43c5b45..4553250 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,16 @@ +2012-10-16 Siddhesh Poyarekar + + [BZ #14652] + * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S + (__condvar_tw_cleanup): Adjust the mutex data structure if it + was locked by FUTEX_WAIT_REQUEUE_PI. + * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait + (__condvar_w_cleanup): Likewise. + * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S + (__condvar_cleanup2): Likewise. + * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S + (__condvar_cleanup1): Likewise. + 2012-10-10 Carlos O'Donell * sysdeps/pthread/pthread.h [!(defined __GNUC__ && 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 index 884987c..6011f69 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S @@ -662,7 +662,10 @@ __condvar_tw_cleanup: movl (%eax), %ebx andl $TID_MASK, %ebx cmpl %ebx, %gs:TID - je 9f + jne 8f + /* We managed to get the lock. Fix it up before returning. */ + call __pthread_mutex_cond_lock_adjust + jmp 9f 8: call __pthread_mutex_cond_lock 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 index bf1e5fe..b418be3 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S @@ -579,7 +579,10 @@ __condvar_w_cleanup: movl (%eax), %ebx andl $TID_MASK, %ebx cmpl %ebx, %gs:TID - je 9f + jne 8f + /* We managed to get the lock. Fix it up before returning. */ + call __pthread_mutex_cond_lock_adjust + jmp 9f 8: call __pthread_mutex_cond_lock diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S index eb13326..15e451a 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S @@ -784,7 +784,10 @@ __condvar_cleanup2: movl (%rdi), %eax andl $TID_MASK, %eax cmpl %eax, %fs:TID - je 8f + jne 7f + /* We managed to get the lock. Fix it up before returning. */ + callq __pthread_mutex_cond_lock_adjust + jmp 8f 7: callq __pthread_mutex_cond_lock diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S index 6c6dc0e..2c6b515 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S @@ -508,7 +508,11 @@ __condvar_cleanup1: movl (%rdi), %eax andl $TID_MASK, %eax cmpl %eax, %fs:TID - je 8f + jne 7f + /* We managed to get the lock. Fix it up before returning. */ + callq __pthread_mutex_cond_lock_adjust + jmp 8f + 7: callq __pthread_mutex_cond_lock -- 2.7.4