mirror of
https://sourceware.org/git/glibc.git
synced 2025-09-02 16:01:20 +03:00
Update.
2003-06-05 Ulrich Drepper <drepper@redhat.com> * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h (pthread_rwlock_t): Change type of __writer element to int. * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. * sysdeps/i386/tcb-offsets.sym: Replace SELF entry with TID entry. * sysdeps/x86_64/tcb-offsets.sym: Likewise. * pthread_rwlock_trywrlock.c: Store TID not self pointer in __writer. Compare with TID to determine deadlocks. * sysdeps/pthread/pthread_rwlock_rdlock.c: Likewise. * sysdeps/pthread/pthread_rwlock_timedrdlock.c: Likewise. * sysdeps/pthread/pthread_rwlock_timedwrlock.: Likewise. * sysdeps/pthread/pthread_rwlock_wrlock.c: Likewise. * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Likewise. * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: Likewise. * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: Likewise. * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise. * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S: Likewise. * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S: Likewise. * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S: Likewise. * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S: Likewise. * Makefile (tests): Add tst-rwlock12. * tst-rwlock12.c: New file.
This commit is contained in:
@@ -1,3 +1,35 @@
|
|||||||
|
2003-06-05 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h (pthread_rwlock_t):
|
||||||
|
Change type of __writer element to int.
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise.
|
||||||
|
* sysdeps/i386/tcb-offsets.sym: Replace SELF entry with TID entry.
|
||||||
|
* sysdeps/x86_64/tcb-offsets.sym: Likewise.
|
||||||
|
* pthread_rwlock_trywrlock.c: Store TID not self pointer in __writer.
|
||||||
|
Compare with TID to determine deadlocks.
|
||||||
|
* sysdeps/pthread/pthread_rwlock_rdlock.c: Likewise.
|
||||||
|
* sysdeps/pthread/pthread_rwlock_timedrdlock.c: Likewise.
|
||||||
|
* sysdeps/pthread/pthread_rwlock_timedwrlock.: Likewise.
|
||||||
|
* sysdeps/pthread/pthread_rwlock_wrlock.c: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S:
|
||||||
|
Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S:
|
||||||
|
Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S:
|
||||||
|
Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S:
|
||||||
|
Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S: Likewise.
|
||||||
|
* Makefile (tests): Add tst-rwlock12.
|
||||||
|
* tst-rwlock12.c: New file.
|
||||||
|
|
||||||
2003-06-05 Jakub Jelinek <jakub@redhat.com>
|
2003-06-05 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/lowlevellock.c (__lll_lock_wait,
|
* sysdeps/unix/sysv/linux/lowlevellock.c (__lll_lock_wait,
|
||||||
|
@@ -146,7 +146,7 @@ tests = tst-attr1 tst-attr2 \
|
|||||||
tst-cond8 tst-cond9 tst-cond10 tst-cond11 \
|
tst-cond8 tst-cond9 tst-cond10 tst-cond11 \
|
||||||
tst-rwlock1 tst-rwlock2 tst-rwlock3 tst-rwlock4 tst-rwlock5 \
|
tst-rwlock1 tst-rwlock2 tst-rwlock3 tst-rwlock4 tst-rwlock5 \
|
||||||
tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 tst-rwlock10 \
|
tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 tst-rwlock10 \
|
||||||
tst-rwlock11 \
|
tst-rwlock11 tst-rwlock12 \
|
||||||
tst-once1 tst-once2 tst-once3 tst-once4 \
|
tst-once1 tst-once2 tst-once3 tst-once4 \
|
||||||
tst-key1 tst-key2 tst-key3 tst-key4 \
|
tst-key1 tst-key2 tst-key3 tst-key4 \
|
||||||
tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \
|
tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \
|
||||||
|
@@ -32,7 +32,7 @@ __pthread_rwlock_trywrlock (rwlock)
|
|||||||
|
|
||||||
if (rwlock->__data.__writer == 0 && rwlock->__data.__nr_readers == 0)
|
if (rwlock->__data.__writer == 0 && rwlock->__data.__nr_readers == 0)
|
||||||
{
|
{
|
||||||
rwlock->__data.__writer = (pthread_t) THREAD_ID;
|
rwlock->__data.__writer = THREAD_GETMEM (THREAD_SELF, tid);
|
||||||
result = 0;
|
result = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#include <tls.h>
|
#include <tls.h>
|
||||||
|
|
||||||
SELF offsetof (tcbhead_t, self)
|
TID offsetof (struct pthread, tid)
|
||||||
MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads)
|
MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads)
|
||||||
SYSINFO_OFFSET offsetof (tcbhead_t, sysinfo)
|
SYSINFO_OFFSET offsetof (tcbhead_t, sysinfo)
|
||||||
CLEANUP offsetof (struct pthread, cleanup)
|
CLEANUP offsetof (struct pthread, cleanup)
|
||||||
|
@@ -55,9 +55,8 @@ __pthread_rwlock_rdlock (rwlock)
|
|||||||
|
|
||||||
/* Make sure we are not holding the rwlock as a writer. This is
|
/* Make sure we are not holding the rwlock as a writer. This is
|
||||||
a deadlock situation we recognize and report. */
|
a deadlock situation we recognize and report. */
|
||||||
if (rwlock->__data.__writer != 0
|
if (__builtin_expect (rwlock->__data.__writer
|
||||||
&& __builtin_expect (rwlock->__data.__writer
|
== THREAD_GETMEM (THREAD_SELF, tid), 0))
|
||||||
== (pthread_t) THREAD_ID, 0))
|
|
||||||
{
|
{
|
||||||
result = EDEADLK;
|
result = EDEADLK;
|
||||||
break;
|
break;
|
||||||
|
@@ -58,9 +58,8 @@ pthread_rwlock_timedrdlock (rwlock, abstime)
|
|||||||
|
|
||||||
/* Make sure we are not holding the rwlock as a writer. This is
|
/* Make sure we are not holding the rwlock as a writer. This is
|
||||||
a deadlock situation we recognize and report. */
|
a deadlock situation we recognize and report. */
|
||||||
if (rwlock->__data.__writer != 0
|
if (__builtin_expect (rwlock->__data.__writer
|
||||||
&& __builtin_expect (rwlock->__data.__writer
|
== THREAD_GETMEM (THREAD_SELF, tid), 0))
|
||||||
== (pthread_t) THREAD_ID, 0))
|
|
||||||
{
|
{
|
||||||
result = EDEADLK;
|
result = EDEADLK;
|
||||||
break;
|
break;
|
||||||
|
@@ -43,15 +43,14 @@ pthread_rwlock_timedwrlock (rwlock, abstime)
|
|||||||
if (rwlock->__data.__writer == 0 && rwlock->__data.__nr_readers == 0)
|
if (rwlock->__data.__writer == 0 && rwlock->__data.__nr_readers == 0)
|
||||||
{
|
{
|
||||||
/* Mark self as writer. */
|
/* Mark self as writer. */
|
||||||
rwlock->__data.__writer = (pthread_t) THREAD_ID;
|
rwlock->__data.__writer = THREAD_GETMEM (THREAD_SELF, tid);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure we are not holding the rwlock as a writer. This is
|
/* Make sure we are not holding the rwlock as a writer. This is
|
||||||
a deadlock situation we recognize and report. */
|
a deadlock situation we recognize and report. */
|
||||||
if (rwlock->__data.__writer != 0
|
if (__builtin_expect (rwlock->__data.__writer
|
||||||
&& __builtin_expect (rwlock->__data.__writer
|
== THREAD_GETMEM (THREAD_SELF, tid), 0))
|
||||||
== (pthread_t) THREAD_ID, 0))
|
|
||||||
{
|
{
|
||||||
result = EDEADLK;
|
result = EDEADLK;
|
||||||
break;
|
break;
|
||||||
|
@@ -40,15 +40,14 @@ __pthread_rwlock_wrlock (rwlock)
|
|||||||
if (rwlock->__data.__writer == 0 && rwlock->__data.__nr_readers == 0)
|
if (rwlock->__data.__writer == 0 && rwlock->__data.__nr_readers == 0)
|
||||||
{
|
{
|
||||||
/* Mark self as writer. */
|
/* Mark self as writer. */
|
||||||
rwlock->__data.__writer = (pthread_t) THREAD_ID;
|
rwlock->__data.__writer = THREAD_GETMEM (THREAD_SELF, tid);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure we are not holding the rwlock as a writer. This is
|
/* Make sure we are not holding the rwlock as a writer. This is
|
||||||
a deadlock situation we recognize and report. */
|
a deadlock situation we recognize and report. */
|
||||||
if (rwlock->__data.__writer != 0
|
if (__builtin_expect (rwlock->__data.__writer
|
||||||
&& __builtin_expect (rwlock->__data.__writer
|
== THREAD_GETMEM (THREAD_SELF, tid), 0))
|
||||||
== (pthread_t) THREAD_ID, 0))
|
|
||||||
{
|
{
|
||||||
result = EDEADLK;
|
result = EDEADLK;
|
||||||
break;
|
break;
|
||||||
|
@@ -115,7 +115,7 @@ typedef union
|
|||||||
/* FLAGS must stay at this position in the structure to maintain
|
/* FLAGS must stay at this position in the structure to maintain
|
||||||
binary compatibility. */
|
binary compatibility. */
|
||||||
unsigned int __flags;
|
unsigned int __flags;
|
||||||
pthread_t __writer;
|
int __writer;
|
||||||
} __data;
|
} __data;
|
||||||
char __size[__SIZEOF_PTHREAD_RWLOCK_T];
|
char __size[__SIZEOF_PTHREAD_RWLOCK_T];
|
||||||
long int __align;
|
long int __align;
|
||||||
|
@@ -124,7 +124,7 @@ __pthread_rwlock_rdlock:
|
|||||||
call __lll_mutex_lock_wait
|
call __lll_mutex_lock_wait
|
||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
14: cmpl %gs:SELF, %eax
|
14: cmpl %gs:TID, %eax
|
||||||
jne 3b
|
jne 3b
|
||||||
/* Deadlock detected. */
|
/* Deadlock detected. */
|
||||||
movl $EDEADLK, %ecx
|
movl $EDEADLK, %ecx
|
||||||
|
@@ -165,7 +165,7 @@ pthread_rwlock_timedrdlock:
|
|||||||
call __lll_mutex_lock_wait
|
call __lll_mutex_lock_wait
|
||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
14: cmpl %gs:SELF, %eax
|
14: cmpl %gs:TID, %eax
|
||||||
jne 3b
|
jne 3b
|
||||||
movl $EDEADLK, %ecx
|
movl $EDEADLK, %ecx
|
||||||
jmp 9b
|
jmp 9b
|
||||||
|
@@ -135,7 +135,7 @@ pthread_rwlock_timedwrlock:
|
|||||||
|
|
||||||
|
|
||||||
5: xorl %ecx, %ecx
|
5: xorl %ecx, %ecx
|
||||||
movl %gs:SELF, %eax
|
movl %gs:TID, %eax
|
||||||
movl %eax, WRITER(%ebp)
|
movl %eax, WRITER(%ebp)
|
||||||
9: LOCK
|
9: LOCK
|
||||||
#if MUTEX == 0
|
#if MUTEX == 0
|
||||||
@@ -163,7 +163,7 @@ pthread_rwlock_timedwrlock:
|
|||||||
call __lll_mutex_lock_wait
|
call __lll_mutex_lock_wait
|
||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
14: cmpl %gs:SELF, %eax
|
14: cmpl %gs:TID, %eax
|
||||||
jne 3b
|
jne 3b
|
||||||
20: movl $EDEADLK, %ecx
|
20: movl $EDEADLK, %ecx
|
||||||
jmp 9b
|
jmp 9b
|
||||||
|
@@ -97,7 +97,7 @@ __pthread_rwlock_wrlock:
|
|||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
5: xorl %ecx, %ecx
|
5: xorl %ecx, %ecx
|
||||||
movl %gs:SELF, %eax
|
movl %gs:TID, %eax
|
||||||
movl %eax, WRITER(%ebx)
|
movl %eax, WRITER(%ebx)
|
||||||
9: LOCK
|
9: LOCK
|
||||||
#if MUTEX == 0
|
#if MUTEX == 0
|
||||||
@@ -122,7 +122,7 @@ __pthread_rwlock_wrlock:
|
|||||||
call __lll_mutex_lock_wait
|
call __lll_mutex_lock_wait
|
||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
14: cmpl %gs:SELF, %eax
|
14: cmpl %gs:TID , %eax
|
||||||
jne 3b
|
jne 3b
|
||||||
movl $EDEADLK, %ecx
|
movl $EDEADLK, %ecx
|
||||||
jmp 9b
|
jmp 9b
|
||||||
|
@@ -112,9 +112,10 @@ typedef union
|
|||||||
unsigned int __writer_wakeup;
|
unsigned int __writer_wakeup;
|
||||||
unsigned int __nr_readers_queued;
|
unsigned int __nr_readers_queued;
|
||||||
unsigned int __nr_writers_queued;
|
unsigned int __nr_writers_queued;
|
||||||
pthread_t __writer;
|
int __writer;
|
||||||
unsigned long int __pad1;
|
int __pad1;
|
||||||
unsigned long int __pad2;
|
unsigned long int __pad2;
|
||||||
|
unsigned long int __pad3;
|
||||||
/* FLAGS must stay at this position in the structure to maintain
|
/* FLAGS must stay at this position in the structure to maintain
|
||||||
binary compatibility. */
|
binary compatibility. */
|
||||||
unsigned int __flags;
|
unsigned int __flags;
|
||||||
|
@@ -128,9 +128,10 @@ typedef union
|
|||||||
unsigned int __writer_wakeup;
|
unsigned int __writer_wakeup;
|
||||||
unsigned int __nr_readers_queued;
|
unsigned int __nr_readers_queued;
|
||||||
unsigned int __nr_writers_queued;
|
unsigned int __nr_writers_queued;
|
||||||
pthread_t __writer;
|
int __writer;
|
||||||
unsigned long int __pad1;
|
int __pad1;
|
||||||
unsigned long int __pad2;
|
unsigned long int __pad2;
|
||||||
|
unsigned long int __pad3;
|
||||||
/* FLAGS must stay at this position in the structure to maintain
|
/* FLAGS must stay at this position in the structure to maintain
|
||||||
binary compatibility. */
|
binary compatibility. */
|
||||||
unsigned int __flags;
|
unsigned int __flags;
|
||||||
@@ -147,7 +148,7 @@ typedef union
|
|||||||
/* FLAGS must stay at this position in the structure to maintain
|
/* FLAGS must stay at this position in the structure to maintain
|
||||||
binary compatibility. */
|
binary compatibility. */
|
||||||
unsigned int __flags;
|
unsigned int __flags;
|
||||||
pthread_t __writer;
|
int __writer;
|
||||||
} __data;
|
} __data;
|
||||||
# endif
|
# endif
|
||||||
char __size[__SIZEOF_PTHREAD_RWLOCK_T];
|
char __size[__SIZEOF_PTHREAD_RWLOCK_T];
|
||||||
|
@@ -127,9 +127,10 @@ typedef union
|
|||||||
unsigned int __writer_wakeup;
|
unsigned int __writer_wakeup;
|
||||||
unsigned int __nr_readers_queued;
|
unsigned int __nr_readers_queued;
|
||||||
unsigned int __nr_writers_queued;
|
unsigned int __nr_writers_queued;
|
||||||
pthread_t __writer;
|
int __writer;
|
||||||
unsigned long int __pad1;
|
int __pad1;
|
||||||
unsigned long int __pad2;
|
unsigned long int __pad2;
|
||||||
|
unsigned long int __pad3;
|
||||||
/* FLAGS must stay at this position in the structure to maintain
|
/* FLAGS must stay at this position in the structure to maintain
|
||||||
binary compatibility. */
|
binary compatibility. */
|
||||||
unsigned int __flags;
|
unsigned int __flags;
|
||||||
@@ -146,7 +147,7 @@ typedef union
|
|||||||
/* FLAGS must stay at this position in the structure to maintain
|
/* FLAGS must stay at this position in the structure to maintain
|
||||||
binary compatibility. */
|
binary compatibility. */
|
||||||
unsigned int __flags;
|
unsigned int __flags;
|
||||||
pthread_t __writer;
|
int __writer;
|
||||||
} __data;
|
} __data;
|
||||||
# endif
|
# endif
|
||||||
char __size[__SIZEOF_PTHREAD_RWLOCK_T];
|
char __size[__SIZEOF_PTHREAD_RWLOCK_T];
|
||||||
|
@@ -112,9 +112,10 @@ typedef union
|
|||||||
unsigned int __writer_wakeup;
|
unsigned int __writer_wakeup;
|
||||||
unsigned int __nr_readers_queued;
|
unsigned int __nr_readers_queued;
|
||||||
unsigned int __nr_writers_queued;
|
unsigned int __nr_writers_queued;
|
||||||
pthread_t __writer;
|
int __writer;
|
||||||
unsigned long int __pad1;
|
int __pad1;
|
||||||
unsigned long int __pad2;
|
unsigned long int __pad2;
|
||||||
|
unsigned long int __pad3;
|
||||||
/* FLAGS must stay at this position in the structure to maintain
|
/* FLAGS must stay at this position in the structure to maintain
|
||||||
binary compatibility. */
|
binary compatibility. */
|
||||||
unsigned int __flags;
|
unsigned int __flags;
|
||||||
|
@@ -52,8 +52,8 @@ __pthread_rwlock_rdlock:
|
|||||||
testl %esi, %esi
|
testl %esi, %esi
|
||||||
jne 1f
|
jne 1f
|
||||||
|
|
||||||
2: movq WRITER(%rdi), %rax
|
2: movl WRITER(%rdi), %eax
|
||||||
testq %rax, %rax
|
testl %eax, %eax
|
||||||
jne 14f
|
jne 14f
|
||||||
cmpl $0, WRITERS_QUEUED(%rdi)
|
cmpl $0, WRITERS_QUEUED(%rdi)
|
||||||
je 5f
|
je 5f
|
||||||
@@ -119,7 +119,7 @@ __pthread_rwlock_rdlock:
|
|||||||
#endif
|
#endif
|
||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
14: cmpq %fs:SELF, %rax
|
14: cmpl %fs:TID, %eax
|
||||||
jne 3b
|
jne 3b
|
||||||
/* Deadlock detected. */
|
/* Deadlock detected. */
|
||||||
movq $EDEADLK, %rdx
|
movq $EDEADLK, %rdx
|
||||||
|
@@ -62,8 +62,8 @@ pthread_rwlock_timedrdlock:
|
|||||||
testl %esi, %esi
|
testl %esi, %esi
|
||||||
jne 1f
|
jne 1f
|
||||||
|
|
||||||
2: movq WRITER(%r12), %rax
|
2: movl WRITER(%r12), %eax
|
||||||
testq %rax, %rax
|
testl %eax, %eax
|
||||||
jne 14f
|
jne 14f
|
||||||
cmpl $0, WRITERS_QUEUED(%r12)
|
cmpl $0, WRITERS_QUEUED(%r12)
|
||||||
je 5f
|
je 5f
|
||||||
@@ -166,7 +166,7 @@ pthread_rwlock_timedrdlock:
|
|||||||
callq __lll_mutex_lock_wait
|
callq __lll_mutex_lock_wait
|
||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
14: cmpq %fs:SELF, %rax
|
14: cmpl %fs:TID, %eax
|
||||||
jne 3b
|
jne 3b
|
||||||
movq $EDEADLK, %rdx
|
movq $EDEADLK, %rdx
|
||||||
jmp 9b
|
jmp 9b
|
||||||
|
@@ -61,8 +61,8 @@ pthread_rwlock_timedwrlock:
|
|||||||
testl %esi, %esi
|
testl %esi, %esi
|
||||||
jne 1f
|
jne 1f
|
||||||
|
|
||||||
2: movq WRITER(%r12), %rax
|
2: movl WRITER(%r12), %eax
|
||||||
testq %rax, %rax
|
testl %eax, %eax
|
||||||
jne 14f
|
jne 14f
|
||||||
cmpl $0, NR_READERS(%r12)
|
cmpl $0, NR_READERS(%r12)
|
||||||
je 5f
|
je 5f
|
||||||
@@ -137,8 +137,8 @@ pthread_rwlock_timedwrlock:
|
|||||||
|
|
||||||
|
|
||||||
5: xorq %rdx, %rdx
|
5: xorq %rdx, %rdx
|
||||||
movq %fs:SELF, %rax
|
movl %fs:TID, %eax
|
||||||
movq %rax, WRITER(%r12)
|
movl %eax, WRITER(%r12)
|
||||||
9: LOCK
|
9: LOCK
|
||||||
#if MUTEX == 0
|
#if MUTEX == 0
|
||||||
decl (%r12)
|
decl (%r12)
|
||||||
@@ -162,7 +162,7 @@ pthread_rwlock_timedwrlock:
|
|||||||
callq __lll_mutex_lock_wait
|
callq __lll_mutex_lock_wait
|
||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
14: cmpq %fs:SELF, %rax
|
14: cmpl %fs:TID, %eax
|
||||||
jne 3b
|
jne 3b
|
||||||
20: movq $EDEADLK, %rdx
|
20: movq $EDEADLK, %rdx
|
||||||
jmp 9b
|
jmp 9b
|
||||||
|
@@ -52,8 +52,8 @@ __pthread_rwlock_wrlock:
|
|||||||
testl %esi, %esi
|
testl %esi, %esi
|
||||||
jne 1f
|
jne 1f
|
||||||
|
|
||||||
2: movq WRITER(%rdi), %rax
|
2: movl WRITER(%rdi), %eax
|
||||||
testq %rax, %rax
|
testl %eax, %eax
|
||||||
jne 14f
|
jne 14f
|
||||||
cmpl $0, NR_READERS(%rdi)
|
cmpl $0, NR_READERS(%rdi)
|
||||||
je 5f
|
je 5f
|
||||||
@@ -93,8 +93,8 @@ __pthread_rwlock_wrlock:
|
|||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
5: xorq %rdx, %rdx
|
5: xorq %rdx, %rdx
|
||||||
movq %fs:SELF, %rax
|
movl %fs:TID, %eax
|
||||||
movq %rax, WRITER(%rdi)
|
movl %eax, WRITER(%rdi)
|
||||||
9: LOCK
|
9: LOCK
|
||||||
#if MUTEX == 0
|
#if MUTEX == 0
|
||||||
decl (%rdi)
|
decl (%rdi)
|
||||||
@@ -117,7 +117,7 @@ __pthread_rwlock_wrlock:
|
|||||||
#endif
|
#endif
|
||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
14: cmpq %fs:SELF, %rax
|
14: cmpl %fs:TID, %eax
|
||||||
jne 3b
|
jne 3b
|
||||||
movq $EDEADLK, %rdx
|
movq $EDEADLK, %rdx
|
||||||
jmp 9b
|
jmp 9b
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#include <tls.h>
|
#include <tls.h>
|
||||||
|
|
||||||
SELF offsetof (tcbhead_t, self)
|
TID offsetof (struct pthread, tid)
|
||||||
CLEANUP offsetof (struct pthread, cleanup)
|
CLEANUP offsetof (struct pthread, cleanup)
|
||||||
CLEANUP_PREV offsetof (struct _pthread_cleanup_buffer, __prev)
|
CLEANUP_PREV offsetof (struct _pthread_cleanup_buffer, __prev)
|
||||||
MUTEX_FUTEX offsetof (pthread_mutex_t, __data.__lock)
|
MUTEX_FUTEX offsetof (pthread_mutex_t, __data.__lock)
|
||||||
|
Reference in New Issue
Block a user