]> sourceware.org Git - glibc.git/commitdiff
Fix mq_notify pthread_barrier_* namespace (bug 18544).
authorJoseph Myers <joseph@codesourcery.com>
Wed, 17 Jun 2015 20:16:56 +0000 (20:16 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 17 Jun 2015 20:16:56 +0000 (20:16 +0000)
mq_notify (present in POSIX by 1996) brings in references to
pthread_barrier_init and pthread_barrier_wait (new in the 2001 edition
of POSIX).  This patch fixes this by making those functions into weak
aliases of __pthread_barrier_*, exporting the __pthread_barrier_*
names at version GLIBC_PRIVATE and using them in mq_notify.

Tested for x86_64 and x86 (testsuite, and comparison of installed
stripped shared libraries).  Changes in addresses from dynamic symbol
table / PLT changes render most comparisons not particularly useful,
but when the addresses of subsequent code don't change there's no sign
of unexpected changes there.  This patch does not remove any
linknamespace XFAILs because of other namespace issues remaining with
mqueue.h functions.

[BZ #18544]
* nptl/pthread_barrier_init.c (pthread_barrier_init): Rename to
__pthread_barrier_init and define as weak alias of
__pthread_barrier_init.
* sysdeps/sparc/nptl/pthread_barrier_init.c
(pthread_barrier_init): Likewise.
* nptl/pthread_barrier_wait.c (pthread_barrier_wait): Rename to
__pthread_barrier_wait and define as weak alias of
__pthread_barrier_wait.
* sysdeps/sparc/nptl/pthread_barrier_wait.c
(pthread_barrier_wait): Likewise.
* sysdeps/sparc/sparc32/pthread_barrier_wait.c
(pthread_barrier_wait): Likewise.
* sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S
(pthread_barrier_wait): Likewise.
* sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S
(pthread_barrier_wait): Likewise.
* nptl/Versions (libpthread): Export __pthread_barrier_init and
__pthread_barrier_wait at version GLIBC_PRIVATE.
* include/pthread.h (__pthread_barrier_init): Declare.
(__pthread_barrier_wait): Likewise.
* sysdeps/unix/sysv/linux/mq_notify.c (notification_function):
Call __pthread_barrier_wait instead of pthread_barrier_wait.
(helper_thread): Likewise.
(init_mq_netlink): Call __pthread_barrier_init instead of
pthread_barrier_init.

12 files changed:
ChangeLog
NEWS
include/pthread.h
nptl/Versions
nptl/pthread_barrier_init.c
nptl/pthread_barrier_wait.c
sysdeps/sparc/nptl/pthread_barrier_init.c
sysdeps/sparc/nptl/pthread_barrier_wait.c
sysdeps/sparc/sparc32/pthread_barrier_wait.c
sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S
sysdeps/unix/sysv/linux/mq_notify.c
sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S

index ea4aeebaadd298bcc3a4e9684f775ccced986328..5b1226a40863cd78e5fecbd416423b0472b8765d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,32 @@
 2015-06-17  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #18544]
+       * nptl/pthread_barrier_init.c (pthread_barrier_init): Rename to
+       __pthread_barrier_init and define as weak alias of
+       __pthread_barrier_init.
+       * sysdeps/sparc/nptl/pthread_barrier_init.c
+       (pthread_barrier_init): Likewise.
+       * nptl/pthread_barrier_wait.c (pthread_barrier_wait): Rename to
+       __pthread_barrier_wait and define as weak alias of
+       __pthread_barrier_wait.
+       * sysdeps/sparc/nptl/pthread_barrier_wait.c
+       (pthread_barrier_wait): Likewise.
+       * sysdeps/sparc/sparc32/pthread_barrier_wait.c
+       (pthread_barrier_wait): Likewise.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S
+       (pthread_barrier_wait): Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S
+       (pthread_barrier_wait): Likewise.
+       * nptl/Versions (libpthread): Export __pthread_barrier_init and
+       __pthread_barrier_wait at version GLIBC_PRIVATE.
+       * include/pthread.h (__pthread_barrier_init): Declare.
+       (__pthread_barrier_wait): Likewise.
+       * sysdeps/unix/sysv/linux/mq_notify.c (notification_function):
+       Call __pthread_barrier_wait instead of pthread_barrier_wait.
+       (helper_thread): Likewise.
+       (init_mq_netlink): Call __pthread_barrier_init instead of
+       pthread_barrier_init.
+
        [BZ #18542]
        * libio/iovswscanf.c (__vswscanf): Use libc_hidden_def.
        (vswscanf): Use ldbl_weak_alias instead of ldbl_strong_alias
diff --git a/NEWS b/NEWS
index d501b3124349ea17cd1f454c926ae8272f36b37a..59586d41df49f9a27b102e40c73df65244c26969 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -22,7 +22,7 @@ Version 2.22
   18324, 18333, 18346, 18397, 18409, 18410, 18412, 18418, 18422, 18434,
   18444, 18468, 18469, 18470, 18479, 18483, 18495, 18496, 18497, 18498,
   18507, 18512, 18519, 18520, 18522, 18527, 18528, 18529, 18530, 18532,
-  18533, 18534, 18536, 18539, 18540, 18542.
+  18533, 18534, 18536, 18539, 18540, 18542, 18544.
 
 * Cache information can be queried via sysconf() function on s390 e.g. with
   _SC_LEVEL1_ICACHE_SIZE as argument.
index 51854f6053b1f735925629cc4b1de09f1af11290..858c869a1697099e125cd77775f13ba64d43870e 100644 (file)
@@ -1,6 +1,16 @@
 #include_next <pthread.h>
 
 #ifndef _ISOMAC
+/* Prototypes repeated instead of using __typeof because pthread.h is
+   included in C++ tests, and declaring functions with __typeof and
+   __THROW doesn't work for C++.  */
+extern int __pthread_barrier_init (pthread_barrier_t *__restrict __barrier,
+                                const pthread_barrierattr_t *__restrict
+                                __attr, unsigned int __count)
+     __THROW __nonnull ((1));
+extern int __pthread_barrier_wait (pthread_barrier_t *__barrier)
+     __THROWNL __nonnull ((1));
+
 /* This function is called to initialize the pthread library.  */
 extern void __pthread_initialize (void) __attribute__ ((weak));
 #endif
index bc8a15b43b9846b961cd53542c231f1c753098ba..34e4b464ed2d40dcf4bc59b375e0a0762fdd798f 100644 (file)
@@ -273,6 +273,7 @@ libpthread {
     __pthread_initialize_minimal;
     __pthread_clock_gettime; __pthread_clock_settime;
     __pthread_unwind; __pthread_get_minstack;
+    __pthread_barrier_init; __pthread_barrier_wait;
     __shm_directory;
   }
 }
index 82e13fb40d91717847f6af1afa71a721b5571bcb..5ea9fad29107990b5008f9748978aa786a9b5f7f 100644 (file)
@@ -29,7 +29,7 @@ static const struct pthread_barrierattr default_barrierattr =
 
 
 int
-pthread_barrier_init (barrier, attr, count)
+__pthread_barrier_init (barrier, attr, count)
      pthread_barrier_t *barrier;
      const pthread_barrierattr_t *attr;
      unsigned int count;
@@ -68,3 +68,4 @@ pthread_barrier_init (barrier, attr, count)
 
   return 0;
 }
+weak_alias (__pthread_barrier_init, pthread_barrier_init)
index 9e7090facfecf63125cbcedcca2d4a5919d3dc59..d69a929ef6ff873116b8a5addc5b2b32f5945702 100644 (file)
@@ -24,7 +24,7 @@
 
 /* Wait on barrier.  */
 int
-pthread_barrier_wait (barrier)
+__pthread_barrier_wait (barrier)
      pthread_barrier_t *barrier;
 {
   struct pthread_barrier *ibarrier = (struct pthread_barrier *) barrier;
@@ -76,3 +76,4 @@ pthread_barrier_wait (barrier)
 
   return result;
 }
+weak_alias (__pthread_barrier_wait, pthread_barrier_wait)
index 01bd18afa0eb597b1679638711a158a2472bb0d2..aa21a63f2db0308ce7283c071da7479ad81bddd6 100644 (file)
@@ -22,7 +22,7 @@
 #include <sparc-nptl.h>
 
 int
-pthread_barrier_init (barrier, attr, count)
+__pthread_barrier_init (barrier, attr, count)
      pthread_barrier_t *barrier;
      const pthread_barrierattr_t *attr;
      unsigned int count;
@@ -53,3 +53,4 @@ pthread_barrier_init (barrier, attr, count)
 
   return 0;
 }
+weak_alias (__pthread_barrier_init, pthread_barrier_init)
index b0437a1505817a1974eb2d55fa2c21942e4d8390..dd4c336dc2349dd65616ef2c17947b591085d545 100644 (file)
@@ -24,7 +24,7 @@
 
 /* Wait on barrier.  */
 int
-pthread_barrier_wait (barrier)
+__pthread_barrier_wait (barrier)
      pthread_barrier_t *barrier;
 {
   union sparc_pthread_barrier *ibarrier
@@ -76,3 +76,4 @@ pthread_barrier_wait (barrier)
 
   return result;
 }
+weak_alias (__pthread_barrier_wait, pthread_barrier_wait)
index afab20311ae462afeb3be31ca302bf48e53597ef..81d22b0653c120d2409ab4ea4372e3e7ebb315ff 100644 (file)
@@ -24,7 +24,7 @@
 
 /* Wait on barrier.  */
 int
-pthread_barrier_wait (barrier)
+__pthread_barrier_wait (barrier)
      pthread_barrier_t *barrier;
 {
   union sparc_pthread_barrier *ibarrier
@@ -92,3 +92,4 @@ pthread_barrier_wait (barrier)
 
   return result;
 }
+weak_alias (__pthread_barrier_wait, pthread_barrier_wait)
index 1d8200f21dac4dde623395557776ff5c60af86bd..ad1a774fbde5971e53409cd61e3fb3a4364a64b2 100644 (file)
 
        .text
 
-       .globl  pthread_barrier_wait
-       .type   pthread_barrier_wait,@function
+       .globl  __pthread_barrier_wait
+       .type   __pthread_barrier_wait,@function
        .align  16
-pthread_barrier_wait:
+__pthread_barrier_wait:
        cfi_startproc
        pushl   %ebx
        cfi_adjust_cfa_offset(4)
@@ -183,4 +183,5 @@ pthread_barrier_wait:
        call    __lll_unlock_wake
        jmp     10b
        cfi_endproc
-       .size   pthread_barrier_wait,.-pthread_barrier_wait
+       .size   __pthread_barrier_wait,.-__pthread_barrier_wait
+weak_alias (__pthread_barrier_wait, pthread_barrier_wait)
index 36b327d5e61965730ffc302cc98d244e061d9d18..5a27274a3dba7562c2cd31400afa224a4602bfa5 100644 (file)
@@ -92,7 +92,7 @@ notification_function (void *arg)
   union sigval param = data->param;
 
   /* Let the parent go.  */
-  (void) pthread_barrier_wait (&notify_barrier);
+  (void) __pthread_barrier_wait (&notify_barrier);
 
   /* Make the thread detached.  */
   (void) pthread_detach (pthread_self ());
@@ -132,7 +132,7 @@ helper_thread (void *arg)
                                == 0, 0))
            /* Since we passed a pointer to DATA to the new thread we have
               to wait until it is done with it.  */
-           (void) pthread_barrier_wait (&notify_barrier);
+           (void) __pthread_barrier_wait (&notify_barrier);
        }
       else if (data.raw[NOTIFY_COOKIE_LEN - 1] == NOTIFY_REMOVED)
        /* The only state we keep is the copy of the thread attributes.  */
@@ -166,7 +166,7 @@ init_mq_netlink (void)
   int err = 1;
 
   /* Initialize the barrier.  */
-  if (__builtin_expect (pthread_barrier_init (&notify_barrier, NULL, 2) == 0,
+  if (__builtin_expect (__pthread_barrier_init (&notify_barrier, NULL, 2) == 0,
                        0))
     {
       /* Create the helper thread.  */
index 69ecc1816aae6b08798d83461d3f33d0a46584e6..e0f7d6c6e69917a60c40c77f2f4d280aa297b993 100644 (file)
 
        .text
 
-       .globl  pthread_barrier_wait
-       .type   pthread_barrier_wait,@function
+       .globl  __pthread_barrier_wait
+       .type   __pthread_barrier_wait,@function
        .align  16
-pthread_barrier_wait:
+__pthread_barrier_wait:
        /* Get the mutex.  */
        xorl    %eax, %eax
        movl    $1, %esi
@@ -157,4 +157,5 @@ pthread_barrier_wait:
        xorl    $LLL_SHARED, %esi
        callq   __lll_unlock_wake
        jmp     10b
-       .size   pthread_barrier_wait,.-pthread_barrier_wait
+       .size   __pthread_barrier_wait,.-__pthread_barrier_wait
+weak_alias (__pthread_barrier_wait, pthread_barrier_wait)
This page took 0.141998 seconds and 5 git commands to generate.