Update.
authorUlrich Drepper <drepper@redhat.com>
Thu, 5 Jun 2003 19:31:57 +0000 (19:31 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 5 Jun 2003 19:31:57 +0000 (19:31 +0000)
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.

22 files changed:
nptl/ChangeLog
nptl/Makefile
nptl/pthread_rwlock_trywrlock.c
nptl/sysdeps/i386/tcb-offsets.sym
nptl/sysdeps/pthread/pthread_rwlock_rdlock.c
nptl/sysdeps/pthread/pthread_rwlock_timedrdlock.c
nptl/sysdeps/pthread/pthread_rwlock_timedwrlock.c
nptl/sysdeps/pthread/pthread_rwlock_wrlock.c
nptl/sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S
nptl/sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h
nptl/sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h
nptl/sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h
nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S
nptl/sysdeps/x86_64/tcb-offsets.sym

index 659eabc..6ee1faa 100644 (file)
@@ -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>
 
        * sysdeps/unix/sysv/linux/lowlevellock.c (__lll_lock_wait,
index 85ba98a..bc17ba5 100644 (file)
@@ -146,7 +146,7 @@ tests = tst-attr1 tst-attr2 \
        tst-cond8 tst-cond9 tst-cond10 tst-cond11 \
        tst-rwlock1 tst-rwlock2 tst-rwlock3 tst-rwlock4 tst-rwlock5 \
        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-key1 tst-key2 tst-key3 tst-key4 \
        tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \
index 755af37..b754a19 100644 (file)
@@ -32,7 +32,7 @@ __pthread_rwlock_trywrlock (rwlock)
 
   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;
     }
 
index 562ac70..12cb6f0 100644 (file)
@@ -1,7 +1,7 @@
 #include <sysdep.h>
 #include <tls.h>
 
-SELF                   offsetof (tcbhead_t, self)
+TID                    offsetof (struct pthread, tid)
 MULTIPLE_THREADS_OFFSET        offsetof (tcbhead_t, multiple_threads)
 SYSINFO_OFFSET         offsetof (tcbhead_t, sysinfo)
 CLEANUP                        offsetof (struct pthread, cleanup)
index 7fb93df..f785bb7 100644 (file)
@@ -55,9 +55,8 @@ __pthread_rwlock_rdlock (rwlock)
 
       /* Make sure we are not holding the rwlock as a writer.  This is
         a deadlock situation we recognize and report.  */
-      if (rwlock->__data.__writer != 0
-         && __builtin_expect (rwlock->__data.__writer
-                              == (pthread_t) THREAD_ID, 0))
+      if (__builtin_expect (rwlock->__data.__writer
+                           == THREAD_GETMEM (THREAD_SELF, tid), 0))
        {
          result = EDEADLK;
          break;
index d5a75ba..2cba0d3 100644 (file)
@@ -58,9 +58,8 @@ pthread_rwlock_timedrdlock (rwlock, abstime)
 
       /* Make sure we are not holding the rwlock as a writer.  This is
         a deadlock situation we recognize and report.  */
-      if (rwlock->__data.__writer != 0
-         && __builtin_expect (rwlock->__data.__writer
-                              == (pthread_t) THREAD_ID, 0))
+      if (__builtin_expect (rwlock->__data.__writer
+                           == THREAD_GETMEM (THREAD_SELF, tid), 0))
        {
          result = EDEADLK;
          break;
index 52308af..a3cdda3 100644 (file)
@@ -43,15 +43,14 @@ pthread_rwlock_timedwrlock (rwlock, abstime)
       if (rwlock->__data.__writer == 0 && rwlock->__data.__nr_readers == 0)
        {
          /* Mark self as writer.  */
-         rwlock->__data.__writer = (pthread_t) THREAD_ID;
+         rwlock->__data.__writer = THREAD_GETMEM (THREAD_SELF, tid);
          break;
        }
 
       /* Make sure we are not holding the rwlock as a writer.  This is
         a deadlock situation we recognize and report.  */
-      if (rwlock->__data.__writer != 0
-         && __builtin_expect (rwlock->__data.__writer
-                              == (pthread_t) THREAD_ID, 0))
+      if (__builtin_expect (rwlock->__data.__writer
+                           == THREAD_GETMEM (THREAD_SELF, tid), 0))
        {
          result = EDEADLK;
          break;
index 171a14a..822aeed 100644 (file)
@@ -40,15 +40,14 @@ __pthread_rwlock_wrlock (rwlock)
       if (rwlock->__data.__writer == 0 && rwlock->__data.__nr_readers == 0)
        {
          /* Mark self as writer.  */
-         rwlock->__data.__writer = (pthread_t) THREAD_ID;
+         rwlock->__data.__writer = THREAD_GETMEM (THREAD_SELF, tid);
          break;
        }
 
       /* Make sure we are not holding the rwlock as a writer.  This is
         a deadlock situation we recognize and report.  */
-      if (rwlock->__data.__writer != 0
-         && __builtin_expect (rwlock->__data.__writer
-                              == (pthread_t) THREAD_ID, 0))
+      if (__builtin_expect (rwlock->__data.__writer
+                           == THREAD_GETMEM (THREAD_SELF, tid), 0))
        {
          result = EDEADLK;
          break;
index 4b0f11a..256589d 100644 (file)
@@ -115,7 +115,7 @@ typedef union
     /* FLAGS must stay at this position in the structure to maintain
        binary compatibility.  */
     unsigned int __flags;
-    pthread_t __writer;
+    int __writer;
   } __data;
   char __size[__SIZEOF_PTHREAD_RWLOCK_T];
   long int __align;
index 6c8dca5..81d9766 100644 (file)
@@ -124,7 +124,7 @@ __pthread_rwlock_rdlock:
        call    __lll_mutex_lock_wait
        jmp     2b
 
-14:    cmpl    %gs:SELF, %eax
+14:    cmpl    %gs:TID, %eax
        jne     3b
        /* Deadlock detected.  */
        movl    $EDEADLK, %ecx
index 3ebe2a5..7d9aa93 100644 (file)
@@ -165,7 +165,7 @@ pthread_rwlock_timedrdlock:
        call    __lll_mutex_lock_wait
        jmp     2b
 
-14:    cmpl    %gs:SELF, %eax
+14:    cmpl    %gs:TID, %eax
        jne     3b
        movl    $EDEADLK, %ecx
        jmp     9b
index 9614f24..4a14445 100644 (file)
@@ -135,7 +135,7 @@ pthread_rwlock_timedwrlock:
 
 
 5:     xorl    %ecx, %ecx
-       movl    %gs:SELF, %eax
+       movl    %gs:TID, %eax
        movl    %eax, WRITER(%ebp)
 9:     LOCK
 #if MUTEX == 0
@@ -163,7 +163,7 @@ pthread_rwlock_timedwrlock:
        call    __lll_mutex_lock_wait
        jmp     2b
 
-14:    cmpl    %gs:SELF, %eax
+14:    cmpl    %gs:TID, %eax
        jne     3b
 20:    movl    $EDEADLK, %ecx
        jmp     9b
index 0b1cc28..28c24ba 100644 (file)
@@ -97,7 +97,7 @@ __pthread_rwlock_wrlock:
        jmp     2b
 
 5:     xorl    %ecx, %ecx
-       movl    %gs:SELF, %eax
+       movl    %gs:TID, %eax
        movl    %eax, WRITER(%ebx)
 9:     LOCK
 #if MUTEX == 0
@@ -122,7 +122,7 @@ __pthread_rwlock_wrlock:
        call    __lll_mutex_lock_wait
        jmp     2b
 
-14:    cmpl    %gs:SELF, %eax
+14:    cmpl    %gs:TID , %eax
        jne     3b
        movl    $EDEADLK, %ecx
        jmp     9b
index e2391a7..afd2f31 100644 (file)
@@ -112,9 +112,10 @@ typedef union
     unsigned int __writer_wakeup;
     unsigned int __nr_readers_queued;
     unsigned int __nr_writers_queued;
-    pthread_t __writer;
-    unsigned long int __pad1;
+    int __writer;
+    int __pad1;
     unsigned long int __pad2;
+    unsigned long int __pad3;
     /* FLAGS must stay at this position in the structure to maintain
        binary compatibility.  */
     unsigned int __flags;
index 588f2a2..8f3e64d 100644 (file)
@@ -128,9 +128,10 @@ typedef union
     unsigned int __writer_wakeup;
     unsigned int __nr_readers_queued;
     unsigned int __nr_writers_queued;
-    pthread_t __writer;
-    unsigned long int __pad1;
+    int __writer;
+    int __pad1;
     unsigned long int __pad2;
+    unsigned long int __pad3;
     /* FLAGS must stay at this position in the structure to maintain
        binary compatibility.  */
     unsigned int __flags;
@@ -147,7 +148,7 @@ typedef union
     /* FLAGS must stay at this position in the structure to maintain
        binary compatibility.  */
     unsigned int __flags;
-    pthread_t __writer;
+    int __writer;
   } __data;
 # endif
   char __size[__SIZEOF_PTHREAD_RWLOCK_T];
index 855af4d..e34875f 100644 (file)
@@ -127,9 +127,10 @@ typedef union
     unsigned int __writer_wakeup;
     unsigned int __nr_readers_queued;
     unsigned int __nr_writers_queued;
-    pthread_t __writer;
-    unsigned long int __pad1;
+    int __writer;
+    int __pad1;
     unsigned long int __pad2;
+    unsigned long int __pad3;
     /* FLAGS must stay at this position in the structure to maintain
        binary compatibility.  */
     unsigned int __flags;
@@ -146,7 +147,7 @@ typedef union
     /* FLAGS must stay at this position in the structure to maintain
        binary compatibility.  */
     unsigned int __flags;
-    pthread_t __writer;
+    int __writer;
   } __data;
 # endif
   char __size[__SIZEOF_PTHREAD_RWLOCK_T];
index 7c12db6..b2919ab 100644 (file)
@@ -112,9 +112,10 @@ typedef union
     unsigned int __writer_wakeup;
     unsigned int __nr_readers_queued;
     unsigned int __nr_writers_queued;
-    pthread_t __writer;
-    unsigned long int __pad1;
+    int __writer;
+    int __pad1;
     unsigned long int __pad2;
+    unsigned long int __pad3;
     /* FLAGS must stay at this position in the structure to maintain
        binary compatibility.  */
     unsigned int __flags;
index 0b0ccf7..0fd093e 100644 (file)
@@ -52,8 +52,8 @@ __pthread_rwlock_rdlock:
        testl   %esi, %esi
        jne     1f
 
-2:     movq    WRITER(%rdi), %rax
-       testq   %rax, %rax
+2:     movl    WRITER(%rdi), %eax
+       testl   %eax, %eax
        jne     14f
        cmpl    $0, WRITERS_QUEUED(%rdi)
        je      5f
@@ -119,7 +119,7 @@ __pthread_rwlock_rdlock:
 #endif
        jmp     2b
 
-14:    cmpq    %fs:SELF, %rax
+14:    cmpl    %fs:TID, %eax
        jne     3b
        /* Deadlock detected.  */
        movq    $EDEADLK, %rdx
index b522f3c..582e030 100644 (file)
@@ -62,8 +62,8 @@ pthread_rwlock_timedrdlock:
        testl   %esi, %esi
        jne     1f
 
-2:     movq    WRITER(%r12), %rax
-       testq   %rax, %rax
+2:     movl    WRITER(%r12), %eax
+       testl   %eax, %eax
        jne     14f
        cmpl    $0, WRITERS_QUEUED(%r12)
        je      5f
@@ -166,7 +166,7 @@ pthread_rwlock_timedrdlock:
        callq   __lll_mutex_lock_wait
        jmp     2b
 
-14:    cmpq    %fs:SELF, %rax
+14:    cmpl    %fs:TID, %eax
        jne     3b
        movq    $EDEADLK, %rdx
        jmp     9b
index 6cbadab..e7acab5 100644 (file)
@@ -61,8 +61,8 @@ pthread_rwlock_timedwrlock:
        testl   %esi, %esi
        jne     1f
 
-2:     movq    WRITER(%r12), %rax
-       testq   %rax, %rax
+2:     movl    WRITER(%r12), %eax
+       testl   %eax, %eax
        jne     14f
        cmpl    $0, NR_READERS(%r12)
        je      5f
@@ -137,8 +137,8 @@ pthread_rwlock_timedwrlock:
 
 
 5:     xorq    %rdx, %rdx
-       movq    %fs:SELF, %rax
-       movq    %rax, WRITER(%r12)
+       movl    %fs:TID, %eax
+       movl    %eax, WRITER(%r12)
 9:     LOCK
 #if MUTEX == 0
        decl    (%r12)
@@ -162,7 +162,7 @@ pthread_rwlock_timedwrlock:
        callq   __lll_mutex_lock_wait
        jmp     2b
 
-14:    cmpq    %fs:SELF, %rax
+14:    cmpl    %fs:TID, %eax
        jne     3b
 20:    movq    $EDEADLK, %rdx
        jmp     9b
index 9e7336b..f866d2e 100644 (file)
@@ -52,8 +52,8 @@ __pthread_rwlock_wrlock:
        testl   %esi, %esi
        jne     1f
 
-2:     movq    WRITER(%rdi), %rax
-       testq   %rax, %rax
+2:     movl    WRITER(%rdi), %eax
+       testl   %eax, %eax
        jne     14f
        cmpl    $0, NR_READERS(%rdi)
        je      5f
@@ -93,8 +93,8 @@ __pthread_rwlock_wrlock:
        jmp     2b
 
 5:     xorq    %rdx, %rdx
-       movq    %fs:SELF, %rax
-       movq    %rax, WRITER(%rdi)
+       movl    %fs:TID, %eax
+       movl    %eax, WRITER(%rdi)
 9:     LOCK
 #if MUTEX == 0
        decl    (%rdi)
@@ -117,7 +117,7 @@ __pthread_rwlock_wrlock:
 #endif
        jmp     2b
 
-14:    cmpq    %fs:SELF, %rax
+14:    cmpl    %fs:TID, %eax
        jne     3b
        movq    $EDEADLK, %rdx
        jmp     9b
index e2abc02..e230e3d 100644 (file)
@@ -1,7 +1,7 @@
 #include <sysdep.h>
 #include <tls.h>
 
-SELF                   offsetof (tcbhead_t, self)
+TID                    offsetof (struct pthread, tid)
 CLEANUP                        offsetof (struct pthread, cleanup)
 CLEANUP_PREV           offsetof (struct _pthread_cleanup_buffer, __prev)
 MUTEX_FUTEX            offsetof (pthread_mutex_t, __data.__lock)