diff options
author | Siddhesh Poyarekar <siddhesh@redhat.com> | 2012-10-10 12:17:27 +0530 |
---|---|---|
committer | Siddhesh Poyarekar <siddhesh@redhat.com> | 2012-10-10 12:52:56 +0530 |
commit | 0e3b5d6a6859d74a18033d3a55e0ee92340437b3 (patch) | |
tree | b4f8c7fe139fb80e4fba77409942b68942a5df48 /nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S | |
parent | f96f12423a1b801f4a198f2568e29e85bd9cc473 (diff) | |
download | glibc-0e3b5d6a6859d74a18033d3a55e0ee92340437b3.tar.gz glibc-0e3b5d6a6859d74a18033d3a55e0ee92340437b3.tar.xz glibc-0e3b5d6a6859d74a18033d3a55e0ee92340437b3.zip |
Take lock in pthread_cond_wait cleanup handler only when needed
[BZ #14652] When a thread waiting in pthread_cond_wait with a PI mutex is cancelled after it has returned successfully from the futex syscall but just before async cancellation is disabled, it enters its cancellation handler with the mutex held and simply calling a mutex_lock again will result in a deadlock. Hence, it is necessary to see if the thread owns the lock and try to lock it only if it doesn't.
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S')
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S | 18 |
1 files changed, 16 insertions, 2 deletions
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 b669abb573..eb133266c6 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 @@ -771,10 +771,24 @@ __condvar_cleanup2: movl $SYS_futex, %eax syscall + /* Lock the mutex only if we don't own it already. This only happens + in case of PI mutexes, if we got cancelled after a successful + return of the futex syscall and before disabling async + cancellation. */ 5: movq 16(%rsp), %rdi - callq __pthread_mutex_cond_lock + movl MUTEX_KIND(%rdi), %eax + andl $(ROBUST_BIT|PI_BIT), %eax + cmpl $PI_BIT, %eax + jne 7f + + movl (%rdi), %eax + andl $TID_MASK, %eax + cmpl %eax, %fs:TID + je 8f + +7: callq __pthread_mutex_cond_lock - movq 24(%rsp), %rdi +8: movq 24(%rsp), %rdi movq FRAME_SIZE(%rsp), %r15 movq FRAME_SIZE+8(%rsp), %r14 movq FRAME_SIZE+16(%rsp), %r13 |