aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2021-05-03 08:12:11 +0200
committerFlorian Weimer <fweimer@redhat.com>2021-05-03 08:14:01 +0200
commit575295fc8314b089e52f98de4aa16a9d7aeb9bf4 (patch)
treebeee73fc51f4c1213cf54e9b137ef9d776eaab66
parentad201afe5c348de265b92bae6688034102a4386b (diff)
downloadglibc-575295fc8314b089e52f98de4aa16a9d7aeb9bf4.tar.xz
glibc-575295fc8314b089e52f98de4aa16a9d7aeb9bf4.zip
nptl: Move call_once into libc
The symbol was moved using scripts/move-symbol-to-libc.py. This change also turns __pthread_once into a compatibility symbol because after the call_once move, an internal call to __pthread_once can be used. This an adjustment to __libc_once: Outside libc (e.g., in nscd), it has to call pthread_once. With __pthread_once as a compatibility symbol, it is no longer to add a new GLIBC_2.34 version after the move from libpthread, and this commit removes the new __pthread_once@@GLIBC_2.34 version. Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
-rw-r--r--nptl/Versions4
-rw-r--r--nptl/pthread_once.c4
-rw-r--r--sysdeps/nptl/libc-lockP.h10
-rw-r--r--sysdeps/pthread/Makefile3
-rw-r--r--sysdeps/pthread/call_once.c11
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/alpha/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/alpha/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/arc/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/arc/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/arm/be/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/arm/be/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/arm/le/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/arm/le/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/csky/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/csky/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/hppa/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/hppa/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/i386/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/i386/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/ia64/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/ia64/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/microblaze/be/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/microblaze/le/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/nios2/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/nios2/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/sh/be/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/sh/be/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/sh/le/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/sh/le/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/64/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist3
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist1
66 files changed, 88 insertions, 69 deletions
diff --git a/nptl/Versions b/nptl/Versions
index 03e159ee0f..1217a15bdf 100644
--- a/nptl/Versions
+++ b/nptl/Versions
@@ -126,6 +126,7 @@ libc {
}
# C11 thread symbols.
GLIBC_2.28 {
+ call_once;
thrd_current;
thrd_equal;
thrd_sleep;
@@ -153,8 +154,8 @@ libc {
__pthread_mutex_unlock;
__pthread_mutexattr_init;
__pthread_mutexattr_settype;
- __pthread_once;
__pthread_setspecific;
+ call_once;
pthread_cond_clockwait;
pthread_condattr_getclock;
pthread_condattr_getpshared;
@@ -373,7 +374,6 @@ libpthread {
# C11 thread symbols.
GLIBC_2.28 {
- call_once;
cnd_broadcast;
cnd_destroy;
cnd_init;
diff --git a/nptl/pthread_once.c b/nptl/pthread_once.c
index 323583c118..e8cf54cf96 100644
--- a/nptl/pthread_once.c
+++ b/nptl/pthread_once.c
@@ -143,8 +143,10 @@ ___pthread_once (pthread_once_t *once_control, void (*init_routine) (void))
else
return __pthread_once_slow (once_control, init_routine);
}
-versioned_symbol (libc, ___pthread_once, __pthread_once, GLIBC_2_34);
libc_hidden_ver (___pthread_once, __pthread_once)
+#ifndef SHARED
+strong_alias (___pthread_once, __pthread_once)
+#endif
versioned_symbol (libc, ___pthread_once, pthread_once, GLIBC_2_34);
#if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_34)
diff --git a/sysdeps/nptl/libc-lockP.h b/sysdeps/nptl/libc-lockP.h
index e573689799..aad9c9778c 100644
--- a/sysdeps/nptl/libc-lockP.h
+++ b/sysdeps/nptl/libc-lockP.h
@@ -210,9 +210,15 @@ _Static_assert (LLL_LOCK_INITIALIZER == 0, "LLL_LOCK_INITIALIZER != 0");
CLASS pthread_once_t NAME = PTHREAD_ONCE_INIT
#endif
-/* Call handler iff the first call. */
-#define __libc_once(ONCE_CONTROL, INIT_FUNCTION) \
+/* Call handler iff the first call. Use a local call in libc, but the
+ global pthread_once symbol elsewhere. */
+#if IS_IN (libc)
+# define __libc_once(ONCE_CONTROL, INIT_FUNCTION) \
__pthread_once (&(ONCE_CONTROL), INIT_FUNCTION)
+#else
+# define __libc_once(ONCE_CONTROL, INIT_FUNCTION) \
+ pthread_once (&(ONCE_CONTROL), INIT_FUNCTION)
+#endif
/* Get once control variable. */
#define __libc_once_get(ONCE_CONTROL) ((ONCE_CONTROL) != PTHREAD_ONCE_INIT)
diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile
index 8133bcda8f..adb4815b4e 100644
--- a/sysdeps/pthread/Makefile
+++ b/sysdeps/pthread/Makefile
@@ -32,7 +32,6 @@ headers += threads.h
routines += thrd_current thrd_equal thrd_sleep thrd_yield
libpthread-routines += thrd_create thrd_detach thrd_exit thrd_join \
- call_once \
mtx_destroy mtx_init mtx_lock mtx_timedlock \
mtx_trylock mtx_unlock \
cnd_broadcast \
@@ -40,7 +39,7 @@ libpthread-routines += thrd_create thrd_detach thrd_exit thrd_join \
tss_create tss_delete tss_get tss_set
$(libpthread-routines-var) += \
-
+ call_once \
tests += tst-cnd-basic tst-mtx-trylock tst-cnd-broadcast \
tst-cnd-timedwait tst-thrd-detach tst-mtx-basic tst-thrd-sleep \
diff --git a/sysdeps/pthread/call_once.c b/sysdeps/pthread/call_once.c
index 9690530ab2..0847dbc9f4 100644
--- a/sysdeps/pthread/call_once.c
+++ b/sysdeps/pthread/call_once.c
@@ -17,11 +17,12 @@
<https://www.gnu.org/licenses/>. */
#include <stdalign.h>
+#include <shlib-compat.h>
#include "thrd_priv.h"
void
-call_once (once_flag *flag, void (*func)(void))
+__call_once (once_flag *flag, void (*func)(void))
{
_Static_assert (sizeof (once_flag) == sizeof (pthread_once_t),
"sizeof (once_flag) != sizeof (pthread_once_t)");
@@ -29,3 +30,11 @@ call_once (once_flag *flag, void (*func)(void))
"alignof (once_flag) != alignof (pthread_once_t)");
__pthread_once ((pthread_once_t *) flag, func);
}
+#if PTHREAD_IN_LIBC
+versioned_symbol (libc, __call_once, call_once, GLIBC_2_34);
+# if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_28, GLIBC_2_34)
+compat_symbol (libpthread, __call_once, call_once, GLIBC_2_28);
+# endif
+#else /* !PTHREAD_IN_LIBC */
+strong_alias (__call_once, call_once)
+#endif
diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
index 96f61e91b5..c11ab22ceb 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
@@ -2198,6 +2198,7 @@ GLIBC_2.27 wcstof64 F
GLIBC_2.27 wcstof64_l F
GLIBC_2.27 wcstof64x F
GLIBC_2.27 wcstof64x_l F
+GLIBC_2.28 call_once F
GLIBC_2.28 fcntl64 F
GLIBC_2.28 renameat2 F
GLIBC_2.28 statx F
@@ -2247,9 +2248,9 @@ GLIBC_2.34 __pthread_mutex_trylock F
GLIBC_2.34 __pthread_mutex_unlock F
GLIBC_2.34 __pthread_mutexattr_init F
GLIBC_2.34 __pthread_mutexattr_settype F
-GLIBC_2.34 __pthread_once F
GLIBC_2.34 __pthread_setspecific F
GLIBC_2.34 __pthread_unwind_next F
+GLIBC_2.34 call_once F
GLIBC_2.34 pthread_cond_clockwait F
GLIBC_2.34 pthread_condattr_getclock F
GLIBC_2.34 pthread_condattr_getpshared F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
index 2f584deb17..d0f5f7b12c 100644
--- a/