From: Siddhesh Poyarekar Date: Tue, 16 Oct 2012 08:53:01 +0000 (+0530) Subject: Adjust mutex lock in condvar_cleanup if we got it from requeue_pi X-Git-Tag: glibc-2.17~401 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9485a404440e392dbcfdc157bbdf5c863f9c0fce;p=thirdparty%2Fglibc.git Adjust mutex lock in condvar_cleanup if we got it from requeue_pi This completes the fix to bz #14652. --- diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 43c5b454585..45532505d46 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 884987cf502..6011f69f129 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 bf1e5fe7888..b418be3c411 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 eb133266c6c..15e451a51c5 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 6c6dc0e74d4..2c6b515d836 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