]> sourceware.org Git - glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Thu, 1 May 2003 23:19:51 +0000 (23:19 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 1 May 2003 23:19:51 +0000 (23:19 +0000)
2003-05-01  Ulrich Drepper  <drepper@redhat.com>

* sysdeps/i386/tls.h: Define THREAD_ID.
* sysdeps/ia64/tls.h: Likewise.
* sysdeps/powerpc/tls.h: Likewise.
* sysdeps/s390/tls.h: Likewise.
* sysdeps/sh/tls.h: Likewise.
* sysdeps/x86_64/tls.h: Likewise.
* pthread_mutex_lock.c: Use THREAD_ID instead of THREAD_SELF to
record ownership.
* pthread_mutex_timedlock.c: Likewise.
* pthread_mutex_trylock.c: Likewise.
* pthread_mutex_unlock.c: Likewise.
* pthread_rwlock_trywrlock.c: Likewise.
* sysdeps/pthread/pthread_rwlocklock_rdlock.c: Likewise.
* sysdeps/pthread/pthread_rwlock_timedrdlock.c: Likewise.
* sysdeps/pthread/pthread_rwlock_timedwrlock.c: Likewise.
* sysdeps/pthread/pthread_rwlock_wrlock.c: Likewise.

* sysdeps/pthread/createthread.c (create_thread): Use CLONE_SYSVSEM
flag.

17 files changed:
nptl/ChangeLog
nptl/pthread_mutex_lock.c
nptl/pthread_mutex_timedlock.c
nptl/pthread_mutex_trylock.c
nptl/pthread_mutex_unlock.c
nptl/pthread_rwlock_trywrlock.c
nptl/sysdeps/i386/tls.h
nptl/sysdeps/ia64/tls.h
nptl/sysdeps/powerpc/tls.h
nptl/sysdeps/pthread/createthread.c
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/s390/tls.h
nptl/sysdeps/sh/tls.h
nptl/sysdeps/x86_64/tls.h

index e627616dcf56147a119e0f31f32eba2161dfa03b..777e61e5e07ac52d8ed2b423d6c4b13135ce8e7f 100644 (file)
@@ -1,3 +1,25 @@
+2003-05-01  Ulrich Drepper  <drepper@redhat.com>
+
+       * sysdeps/i386/tls.h: Define THREAD_ID.
+       * sysdeps/ia64/tls.h: Likewise.
+       * sysdeps/powerpc/tls.h: Likewise.
+       * sysdeps/s390/tls.h: Likewise.
+       * sysdeps/sh/tls.h: Likewise.
+       * sysdeps/x86_64/tls.h: Likewise.
+       * pthread_mutex_lock.c: Use THREAD_ID instead of THREAD_SELF to
+       record ownership.
+       * pthread_mutex_timedlock.c: Likewise.
+       * pthread_mutex_trylock.c: Likewise.
+       * pthread_mutex_unlock.c: Likewise.
+       * pthread_rwlock_trywrlock.c: Likewise.
+       * sysdeps/pthread/pthread_rwlocklock_rdlock.c: Likewise.
+       * sysdeps/pthread/pthread_rwlock_timedrdlock.c: Likewise.
+       * sysdeps/pthread/pthread_rwlock_timedwrlock.c: Likewise.
+       * sysdeps/pthread/pthread_rwlock_wrlock.c: Likewise.
+
+       * sysdeps/pthread/createthread.c (create_thread): Use CLONE_SYSVSEM
+       flag.
+
 2003-04-29  Jakub Jelinek  <jakub@redhat.com>
 
        * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
index 5040232cf0f0aa5aae10602d0e97d417013f7ca5..f70445acfc50f6656cb7135cfec2244257e7a7f8 100644 (file)
@@ -26,14 +26,14 @@ int
 __pthread_mutex_lock (mutex)
      pthread_mutex_t *mutex;
 {
-  struct pthread *pd = THREAD_SELF;
+  struct pthread *id = THREAD_ID;
 
   switch (__builtin_expect (mutex->__data.__kind, PTHREAD_MUTEX_TIMED_NP))
     {
       /* Recursive mutex.  */
     case PTHREAD_MUTEX_RECURSIVE_NP:
       /* Check whether we already hold the mutex.  */
-      if (mutex->__data.__owner == pd)
+      if (mutex->__data.__owner == id)
        {
          /* Just bump the counter.  */
          if (__builtin_expect (mutex->__data.__count + 1 == 0, 0))
@@ -48,7 +48,7 @@ __pthread_mutex_lock (mutex)
          lll_mutex_lock (mutex->__data.__lock);
 
          /* Record the ownership.  */
-         mutex->__data.__owner = pd;
+         mutex->__data.__owner = id;
          mutex->__data.__count = 1;
        }
       break;
@@ -56,7 +56,7 @@ __pthread_mutex_lock (mutex)
       /* Error checking mutex.  */
     case PTHREAD_MUTEX_ERRORCHECK_NP:
       /* Check whether we already hold the mutex.  */
-      if (mutex->__data.__owner == pd)
+      if (mutex->__data.__owner == id)
        return EDEADLK;
 
       /* FALLTHROUGH */
@@ -68,7 +68,7 @@ __pthread_mutex_lock (mutex)
       /* Normal mutex.  */
       lll_mutex_lock (mutex->__data.__lock);
       /* Record the ownership.  */
-      mutex->__data.__owner = pd;
+      mutex->__data.__owner = id;
       break;
     }
 
index a63b2048db000a5a1a52b57675ae7df711b3c367..f24f91dd3cc7ff59c185f1e8dff9fd84efee860c 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -27,7 +27,7 @@ pthread_mutex_timedlock (mutex, abstime)
      pthread_mutex_t *mutex;
      const struct timespec *abstime;
 {
-  struct pthread *pd = THREAD_SELF;
+  struct pthread *id = THREAD_ID;
   int result = 0;
 
   /* We must not check ABSTIME here.  If the thread does not block
@@ -38,7 +38,7 @@ pthread_mutex_timedlock (mutex, abstime)
       /* Recursive mutex.  */
     case PTHREAD_MUTEX_RECURSIVE_NP:
       /* Check whether we already hold the mutex.  */
-      if (mutex->__data.__owner == pd)
+      if (mutex->__data.__owner == id)
        {
          /* Just bump the counter.  */
          if (__builtin_expect (mutex->__data.__count + 1 == 0, 0))
@@ -65,7 +65,7 @@ pthread_mutex_timedlock (mutex, abstime)
       /* Error checking mutex.  */
     case PTHREAD_MUTEX_ERRORCHECK_NP:
       /* Check whether we already hold the mutex.  */
-      if (mutex->__data.__owner == pd)
+      if (mutex->__data.__owner == id)
        return EDEADLK;
 
       /* FALLTHROUGH */
@@ -81,7 +81,7 @@ pthread_mutex_timedlock (mutex, abstime)
 
   if (result == 0)
     /* Record the ownership.  */
-    mutex->__data.__owner = pd;
+    mutex->__data.__owner = id;
 
  out:
   return result;
index 394a9cba9b08693e99cb820483ee5da5f0d2cc91..c61d7d58523ef2382ba1e273a62c4fc4cced6a7e 100644 (file)
@@ -26,14 +26,14 @@ int
 __pthread_mutex_trylock (mutex)
      pthread_mutex_t *mutex;
 {
-  struct pthread *pd = THREAD_SELF;
+  struct pthread *id = THREAD_ID;
 
   switch (__builtin_expect (mutex->__data.__kind, PTHREAD_MUTEX_TIMED_NP))
     {
       /* Recursive mutex.  */
     case PTHREAD_MUTEX_RECURSIVE_NP:
       /* Check whether we already hold the mutex.  */
-      if (mutex->__data.__owner == pd)
+      if (mutex->__data.__owner == id)
        {
          /* Just bump the counter.  */
          if (__builtin_expect (mutex->__data.__count + 1 == 0, 0))
@@ -47,7 +47,7 @@ __pthread_mutex_trylock (mutex)
       if (lll_mutex_trylock (mutex->__data.__lock) == 0)
        {
          /* Record the ownership.  */
-         mutex->__data.__owner = pd;
+         mutex->__data.__owner = id;
          mutex->__data.__count = 1;
          return 0;
        }
@@ -63,7 +63,7 @@ __pthread_mutex_trylock (mutex)
       if (lll_mutex_trylock (mutex->__data.__lock) == 0)
        {
          /* Record the ownership.  */
-         mutex->__data.__owner = pd;
+         mutex->__data.__owner = id;
 
          return 0;
        }
index 3595585a8475a446c7d45ebcf6fccda0e9730dff..975127d2b2da2d73cb8593e80ed8440896c6ccad 100644 (file)
@@ -30,23 +30,19 @@ __pthread_mutex_unlock (mutex)
     {
     case PTHREAD_MUTEX_RECURSIVE_NP:
       /* Recursive mutex.  */
-      if (mutex->__data.__owner != THREAD_SELF)
+      if (mutex->__data.__owner != THREAD_ID)
        return EPERM;
 
       if (--mutex->__data.__count != 0)
        /* We still hold the mutex.  */
        return 0;
-
-      mutex->__data.__owner = NULL;
       break;
 
     case PTHREAD_MUTEX_ERRORCHECK_NP:
       /* Error checking mutex.  */
-      if (mutex->__data.__owner != THREAD_SELF
+      if (mutex->__data.__owner != THREAD_ID
          || ! lll_mutex_islocked (mutex->__data.__lock))
        return EPERM;
-
-      mutex->__data.__owner = NULL;
       break;
 
     default:
@@ -57,6 +53,9 @@ __pthread_mutex_unlock (mutex)
       break;
     }
 
+  /* Always reset the owner field.  */
+  mutex->__data.__owner = NULL;
+
   /* Unlock.  */
   lll_mutex_unlock (mutex->__data.__lock);
 
index 32fcbba8c58d28aa6be0e17beb661698ac5759ba..755af373309425c1e3241ebe7761add760b4edb9 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -32,7 +32,7 @@ __pthread_rwlock_trywrlock (rwlock)
 
   if (rwlock->__data.__writer == 0 && rwlock->__data.__nr_readers == 0)
     {
-      rwlock->__data.__writer = (pthread_t) THREAD_SELF;
+      rwlock->__data.__writer = (pthread_t) THREAD_ID;
       result = 0;
     }
 
index 7ee2bcac1948b242546a5faf36bb006b76b16520..03757bb4c7287845b38707a26c6ac387df1cc3b4 100644 (file)
@@ -251,6 +251,10 @@ union user_desc_init
          : "i" (offsetof (struct pthread, header.self)));                            \
      __self;})
 
+/* Identifier for the current thread.  THREAD_SELF is usable but
+   sometimes more expensive than necessary.  It is fine here.  */
+# define THREAD_ID THREAD_SELF
+
 
 /* Read member of the thread descriptor directly.  */
 # define THREAD_GETMEM(descr, member) \
index 8a13a59d306a6bf39d0621996fc721e0bf617d78..5ce74737a7af46ea2738466ccadc0c376e5c19c5 100644 (file)
@@ -113,6 +113,10 @@ register struct pthread *__thread_self __asm__("r13");
 /* Return the thread descriptor for the current thread.  */
 # define THREAD_SELF (__thread_self - 1)
 
+/* Identifier for the current thread.  THREAD_SELF is usable but
+   sometimes more expensive than necessary as in this case.  */
+# define THREAD_ID __thread_self
+
 /* Access to data in the thread descriptor is easy.  */
 #define THREAD_GETMEM(descr, member) \
   descr->member
index 6573bb6b04a4051559ecaa8ab9461a25b60bff4f..70aff09e24d922cee27293e2d17a2e5eadf8f40c 100644 (file)
@@ -129,6 +129,10 @@ register void *__thread_register __asm__ ("r13");
     ((struct pthread *) (__thread_register \
                         - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE))
 
+/* Identifier for the current thread.  THREAD_SELF is usable but
+   sometimes more expensive than necessary as in this case.  */
+# define THREAD_ID __thread_register
+
 /* Read member of the thread descriptor directly.  */
 # define THREAD_GETMEM(descr, member) ((void)(descr), (THREAD_SELF)->member)
 
index 9d00e4e1355ac77ffafbf18934a6f7e1a17cc011..ea1213896ef51f0132024e8b9e27a021ffd383e9 100644 (file)
@@ -78,8 +78,9 @@ create_thread (struct pthread *pd, STACK_VARIABLES_PARMS)
          if (ARCH_CLONE (start_thread_debug, STACK_VARIABLES_ARGS,
                          CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGNAL |
                          CLONE_SETTLS | CLONE_PARENT_SETTID |
-                         CLONE_CHILD_CLEARTID | CLONE_DETACHED | 0,
-                         pd, &pd->tid, TLS_VALUE, &pd->tid) == -1)
+                         CLONE_CHILD_CLEARTID | CLONE_DETACHED |
+                         CLONE_SYSVSEM | 0, pd, &pd->tid, TLS_VALUE,
+                         &pd->tid) == -1)
            /* Failed.  */
            return errno;
 
@@ -151,7 +152,8 @@ create_thread (struct pthread *pd, STACK_VARIABLES_PARMS)
   if (ARCH_CLONE (start_thread, STACK_VARIABLES_ARGS,
                  CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGNAL |
                  CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID |
-                 CLONE_DETACHED | 0, pd, &pd->tid, TLS_VALUE, &pd->tid) == -1)
+                 CLONE_DETACHED | CLONE_SYSVSEM | 0, pd, &pd->tid, TLS_VALUE,
+                 &pd->tid) == -1)
     /* Failed.  */
     return errno;
 
index 197af9c9703c093336e5d3fd5c561cf97b1dd624..7fb93df1de71c102b2efe73c809551368a89d16e 100644 (file)
@@ -57,7 +57,7 @@ __pthread_rwlock_rdlock (rwlock)
         a deadlock situation we recognize and report.  */
       if (rwlock->__data.__writer != 0
          && __builtin_expect (rwlock->__data.__writer
-                              == (pthread_t) THREAD_SELF, 0))
+                              == (pthread_t) THREAD_ID, 0))
        {
          result = EDEADLK;
          break;
index 9c1815570f002e893a3224352e33c0db70b044bd..d5a75ba3b2696b01f0c25e72317645dabedc6ffe 100644 (file)
@@ -60,7 +60,7 @@ pthread_rwlock_timedrdlock (rwlock, abstime)
         a deadlock situation we recognize and report.  */
       if (rwlock->__data.__writer != 0
          && __builtin_expect (rwlock->__data.__writer
-                              == (pthread_t) THREAD_SELF, 0))
+                              == (pthread_t) THREAD_ID, 0))
        {
          result = EDEADLK;
          break;
index e4d08ea657ca3c1be4c2846c51113623f41cfd9e..52308aff918372e1a05a0fd7c9a52f717062c4bf 100644 (file)
@@ -43,7 +43,7 @@ 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_SELF;
+         rwlock->__data.__writer = (pthread_t) THREAD_ID;
          break;
        }
 
@@ -51,7 +51,7 @@ pthread_rwlock_timedwrlock (rwlock, abstime)
         a deadlock situation we recognize and report.  */
       if (rwlock->__data.__writer != 0
          && __builtin_expect (rwlock->__data.__writer
-                              == (pthread_t) THREAD_SELF, 0))
+                              == (pthread_t) THREAD_ID, 0))
        {
          result = EDEADLK;
          break;
index 03c37a1933c14b7c658542de0a96e8be6e21e161..171a14adb1f5b7768b41e5b4744b3a54fa81236c 100644 (file)
@@ -40,7 +40,7 @@ __pthread_rwlock_wrlock (rwlock)
       if (rwlock->__data.__writer == 0 && rwlock->__data.__nr_readers == 0)
        {
          /* Mark self as writer.  */
-         rwlock->__data.__writer = (pthread_t) THREAD_SELF;
+         rwlock->__data.__writer = (pthread_t) THREAD_ID;
          break;
        }
 
@@ -48,7 +48,7 @@ __pthread_rwlock_wrlock (rwlock)
         a deadlock situation we recognize and report.  */
       if (rwlock->__data.__writer != 0
          && __builtin_expect (rwlock->__data.__writer
-                              == (pthread_t) THREAD_SELF, 0))
+                              == (pthread_t) THREAD_ID, 0))
        {
          result = EDEADLK;
          break;
index 06237ae15b91f193d4cac5f04a9b2197edfb6aed..89e51ff2286897143a5169fcca21a41d4c3a4d4f 100644 (file)
@@ -137,6 +137,10 @@ typedef struct
 /* Return the thread descriptor for the current thread.  */
 # define THREAD_SELF ((struct pthread *) __builtin_thread_pointer ())
 
+/* Identifier for the current thread.  THREAD_SELF is usable but
+   sometimes more expensive than necessary.  It is fine here.  */
+# define THREAD_ID THREAD_SELF
+
 /* Access to data in the thread descriptor is easy.  */
 #define THREAD_GETMEM(descr, member) \
   descr->member
index 1e27b987e05d49d374d1ab74582e8f5317712055..a6cefa0b3103461f07f4dfce1a4c31bcd48572fa 100644 (file)
@@ -117,6 +117,13 @@ typedef struct
      __asm ("stc gbr,%0" : "=r" (__self));                                   \
      __self - 1;})
 
+/* Identifier for the current thread.  THREAD_SELF is usable but
+   sometimes more expensive than necessary as in this case.  */
+# define THREAD_ID \
+  ({ struct pthread *__self;                                                 \
+     __asm ("stc gbr,%0" : "=r" (__self));                                   \
+     __self;})
+
 /* Read member of the thread descriptor directly.  */
 # define THREAD_GETMEM(descr, member) (descr->member)
 
index ab13f254315ae3c5c968edceaa7c76655715c40d..074eb64a8cf58c499bf63e69490e142b85e72441 100644 (file)
@@ -159,6 +159,10 @@ typedef struct
          : "i" (offsetof (struct pthread, header.self)));                    \
      __self;})
 
+/* Identifier for the current thread.  THREAD_SELF is usable but
+   sometimes more expensive than necessary.  It is fine here.  */
+# define THREAD_ID THREAD_SELF
+
 
 /* Read member of the thread descriptor directly.  */
 # define THREAD_GETMEM(descr, member) \
This page took 0.072385 seconds and 5 git commands to generate.