This is notably needed for the main thread structure to be always
initialized so that some pthread functions can work from the main thread
without other threads, e.g. pthread_cancel.
---
htl/Makefile | 4 +--
htl/Versions | 12 +++-----
htl/pt-create.c | 34 ++++++++++++++-------
hurd/hurdsig.c | 6 ++--
sysdeps/htl/pthreadP.h | 7 ++---
sysdeps/mach/hurd/htl/pt-sysdep.c | 14 +++------
sysdeps/mach/hurd/i386/libc.abilist | 2 ++
sysdeps/mach/hurd/i386/libpthread.abilist | 1 -
sysdeps/mach/hurd/x86_64/libc.abilist | 2 ++
sysdeps/mach/hurd/x86_64/libpthread.abilist | 1 -
10 files changed, 43 insertions(+), 40 deletions(-)
diff --git a/htl/Makefile b/htl/Makefile
index f841b33b51..e59a7fff68 100644
--- a/htl/Makefile
+++ b/htl/Makefile
@@ -25,11 +25,9 @@ SYSDEPS :=
LCLHDRS :=
libpthread-routines := \
- pt-create \
pt-spin-inlines \
pt-hurd-cond-wait \
pt-hurd-cond-timedwait \
- pt-sysdep \
pt-spin \
pt-getname-np \
pt-setname-np \
@@ -115,6 +113,7 @@ routines := \
pt-condattr-init \
pt-condattr-setclock \
pt-condattr-setpshared \
+ pt-create \
pt-dealloc \
pt-destroy-specific \
pt-detach \
@@ -185,6 +184,7 @@ routines := \
pt-sigstate-init \
pt-stack-alloc \
pt-startup \
+ pt-sysdep \
pt-testcancel \
pt-thread-alloc \
pt-thread-start \
diff --git a/htl/Versions b/htl/Versions
index 280459c2a6..d46490b3a5 100644
--- a/htl/Versions
+++ b/htl/Versions
@@ -53,6 +53,7 @@ libc {
pthread_condattr_getpshared;
pthread_condattr_setclock;
pthread_condattr_setpshared;
+ pthread_create;
pthread_detach;
pthread_getattr_np;
pthread_getconcurrency;
@@ -219,6 +220,7 @@ libc {
GLIBC_2.43 {
pthread_cancel;
pthread_clockjoin_np;
+ pthread_create;
pthread_detach;
pthread_getattr_np;
pthread_getconcurrency;
@@ -252,6 +254,7 @@ libc {
__pthread_alloc;
__pthread_block;
__pthread_block_intr;
+ __pthread_create;
__pthread_init_thread;
__pthread_init_static_tls;
__pthread_default_attr;
@@ -279,6 +282,7 @@ libc {
__pthread_destroy_specific;
__pthread_exit;
__pthread_getspecific;
+ __pthread_initialize_minimal;
__pthread_join;
__pthread_key_delete;
__pthread_max_threads;
@@ -316,8 +320,6 @@ libpthread {
GLIBC_2.12 {
pthread_atfork;
- pthread_create;
-
pthread_spin_destroy; pthread_spin_init; pthread_spin_lock;
pthread_spin_trylock; pthread_spin_unlock;
__pthread_spin_destroy; __pthread_spin_init;
@@ -342,10 +344,4 @@ libpthread {
pthread_getname_np;
pthread_setname_np;
}
-
- GLIBC_PRIVATE {
- __pthread_initialize_minimal;
-
- __pthread_create;
- }
}
diff --git a/htl/pt-create.c b/htl/pt-create.c
index d3fee29d20..820037e8a9 100644
--- a/htl/pt-create.c
+++ b/htl/pt-create.c
@@ -25,13 +25,14 @@
#include <atomic.h>
#include <hurd/resource.h>
#include <sys/single_threaded.h>
+#include <shlib-compat.h>
+#include <ldsodefs.h>
#include <pt-internal.h>
#include <pthreadP.h>
-#if IS_IN (libpthread)
-# include <ctype.h>
-#endif
+#include <ctype.h>
+
#ifdef HAVE_USELOCALE
# include <locale.h>
#endif
@@ -45,10 +46,9 @@ entry_point (struct __pthread *self, void *(*start_routine)
(void *), void *arg)
___pthread_self = self;
__resp = &self->res_state;
-#if IS_IN (libpthread)
/* Initialize pointers to locale data. */
__ctype_init ();
-#endif
+
#ifdef HAVE_USELOCALE
/* A fresh thread needs to be bound to the global locale. */
uselocale (LC_GLOBAL_LOCALE);
@@ -78,6 +78,24 @@ entry_point (struct __pthread *self, void *(*start_routine)
(void *), void *arg)
int
__pthread_create (pthread_t * thread, const pthread_attr_t * attr,
void *(*start_routine) (void *), void *arg)
+{
+ /* Avoid a data race in the multi-threaded case. */
+ if (__libc_single_threaded)
+ __libc_single_threaded = 0;
+
+ return __libc_pthread_create (thread, attr, start_routine, arg);
+}
+versioned_symbol (libc, __pthread_create, pthread_create, GLIBC_2_43);
+#if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_12, GLIBC_2_43)
+compat_symbol (libpthread, __pthread_create, pthread_create, GLIBC_2_12);
+#endif
+hidden_def (__pthread_create)
+
+/* Version of pthread_create which does not make __libc_single_threaded zero.
+ This is notably useful for the signal thread. */
+int
+__libc_pthread_create (pthread_t * thread, const pthread_attr_t * attr,
+ void *(*start_routine) (void *), void *arg)
{
int err;
struct __pthread *pthread;
@@ -90,8 +108,6 @@ __pthread_create (pthread_t * thread, const pthread_attr_t *
attr,
return err;
}
-weak_alias (__pthread_create, pthread_create)
-hidden_def (__pthread_create)
/* Internal version of pthread_create. See comment in
pt-internal.h. */
@@ -106,10 +122,6 @@ __pthread_create_internal (struct __pthread **thread,
sigset_t sigset;
size_t stacksize;
- /* Avoid a data race in the multi-threaded case. */
- if (__libc_single_threaded)
- __libc_single_threaded = 0;
-
/* Allocate a new thread structure. */
err = __pthread_alloc (&pthread);
if (err)
diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c
index 672bc06f88..ab02b1d7e5 100644
--- a/hurd/hurdsig.c
+++ b/hurd/hurdsig.c
@@ -1519,8 +1519,8 @@ _hurdsig_init (const int *intarray, size_t intarraysize)
/* Start the signal thread listening on the message port. */
-#pragma weak __pthread_create
- if (!__pthread_create)
+#pragma weak __libc_pthread_create
+ if (!__libc_pthread_create)
{
err = __thread_create (__mach_task_self (), &_hurd_msgport_thread);
assert_perror (err);
@@ -1564,7 +1564,7 @@ _hurdsig_init (const int *intarray, size_t intarraysize)
#pragma weak __pthread_detach
#pragma weak __pthread_getattr_np
#pragma weak __pthread_attr_getstack
- __pthread_create(&thread, NULL, &_hurd_msgport_receive, NULL);
+ __libc_pthread_create (&thread, NULL, &_hurd_msgport_receive, NULL);
/* Record signal thread stack layout for fork() */
__pthread_getattr_np (thread, &attr);
diff --git a/sysdeps/htl/pthreadP.h b/sysdeps/htl/pthreadP.h
index 471a4cfa43..5fb6469714 100644
--- a/sysdeps/htl/pthreadP.h
+++ b/sysdeps/htl/pthreadP.h
@@ -24,7 +24,6 @@
#include <pthread.h>
#include <link.h>
#include <bits/cancelation.h>
-#include <libc-symbols.h>
/* Attribute to indicate thread creation was issued from C11 thrd_create. */
#define ATTR_C11_THREAD ((void*)(uintptr_t)-1)
@@ -170,6 +169,8 @@ libc_hidden_proto (__pthread_setcanceltype);
extern int __pthread_sigmask (int, const sigset_t *, sigset_t *);
libc_hidden_proto (__pthread_sigmask);
+int __libc_pthread_create (pthread_t * thread, const pthread_attr_t * attr,
+ void *(*start_routine) (void *), void *arg);
int __pthread_create (pthread_t *newthread,
const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
@@ -232,9 +233,7 @@ libc_hidden_proto (__pthread_attr_init)
libc_hidden_proto (__pthread_condattr_init)
libc_hidden_proto (__pthread_get_cleanup_stack)
-#if IS_IN (libpthread)
-hidden_proto (__pthread_create)
-#endif
+libc_hidden_proto (__pthread_create)
#define ASSERT_TYPE_SIZE(type, size) \
_Static_assert (sizeof (type) == size, \
diff --git a/sysdeps/mach/hurd/htl/pt-sysdep.c
b/sysdeps/mach/hurd/htl/pt-sysdep.c
index 43745095bf..4d6a710ca8 100644
--- a/sysdeps/mach/hurd/htl/pt-sysdep.c
+++ b/sysdeps/mach/hurd/htl/pt-sysdep.c
@@ -26,6 +26,9 @@
#include <pt-internal.h>
#include <pthreadP.h>
#include <stackinfo.h>
+#include <ldsodefs.h>
+#include <register-atfork.h>
+#include <dso_handle.h>
static void
reset_pthread_total (void)
@@ -118,7 +121,7 @@ _init_routine (void *stack)
when we return from here) shouldn't be seen as a user thread. */
__pthread_total--;
- __pthread_atfork (NULL, NULL, reset_pthread_total);
+ __register_atfork (NULL, NULL, reset_pthread_total, __dso_handle);
GL(dl_init_static_tls) = &__pthread_init_static_tls;
@@ -131,12 +134,3 @@ __pthread_initialize_minimal (void)
{
_init_routine (__libc_stack_end);
}
-
-#ifdef SHARED
-__attribute__ ((constructor))
-static void
-dynamic_init_routine (void)
-{
- _init_routine (__libc_stack_end);
-}
-#endif
diff --git a/sysdeps/mach/hurd/i386/libc.abilist
b/sysdeps/mach/hurd/i386/libc.abilist
index bbd00ed11a..f7c323c834 100644
--- a/sysdeps/mach/hurd/i386/libc.abilist
+++ b/sysdeps/mach/hurd/i386/libc.abilist
@@ -76,6 +76,7 @@ GLIBC_2.12 pthread_condattr_getpshared F
GLIBC_2.12 pthread_condattr_init F
GLIBC_2.12 pthread_condattr_setclock F
GLIBC_2.12 pthread_condattr_setpshared F
+GLIBC_2.12 pthread_create F
GLIBC_2.12 pthread_detach F
GLIBC_2.12 pthread_equal F
GLIBC_2.12 pthread_exit F
@@ -2670,6 +2671,7 @@ GLIBC_2.43 memalignment F
GLIBC_2.43 memset_explicit F
GLIBC_2.43 pthread_cancel F
GLIBC_2.43 pthread_clockjoin_np F
+GLIBC_2.43 pthread_create F
GLIBC_2.43 pthread_detach F
GLIBC_2.43 pthread_getattr_np F
GLIBC_2.43 pthread_getconcurrency F
diff --git a/sysdeps/mach/hurd/i386/libpthread.abilist
b/sysdeps/mach/hurd/i386/libpthread.abilist
index c55b78b01c..e1844a8f5e 100644
--- a/sysdeps/mach/hurd/i386/libpthread.abilist
+++ b/sysdeps/mach/hurd/i386/libpthread.abilist
@@ -5,7 +5,6 @@ GLIBC_2.12 __pthread_spin_trylock F
GLIBC_2.12 __pthread_spin_unlock F
GLIBC_2.12 _pthread_spin_lock F
GLIBC_2.12 pthread_atfork F
-GLIBC_2.12 pthread_create F
GLIBC_2.12 pthread_spin_destroy F
GLIBC_2.12 pthread_spin_init F
GLIBC_2.12 pthread_spin_lock F
diff --git a/sysdeps/mach/hurd/x86_64/libc.abilist
b/sysdeps/mach/hurd/x86_64/libc.abilist
index 5fb477342e..b482d2d040 100644
--- a/sysdeps/mach/hurd/x86_64/libc.abilist
+++ b/sysdeps/mach/hurd/x86_64/libc.abilist
@@ -1556,6 +1556,7 @@ GLIBC_2.38 pthread_condattr_getpshared F
GLIBC_2.38 pthread_condattr_init F
GLIBC_2.38 pthread_condattr_setclock F
GLIBC_2.38 pthread_condattr_setpshared F
+GLIBC_2.38 pthread_create F
GLIBC_2.38 pthread_detach F
GLIBC_2.38 pthread_equal F
GLIBC_2.38 pthread_exit F
@@ -2348,6 +2349,7 @@ GLIBC_2.43 memalignment F
GLIBC_2.43 memset_explicit F
GLIBC_2.43 pthread_cancel F
GLIBC_2.43 pthread_clockjoin_np F
+GLIBC_2.43 pthread_create F
GLIBC_2.43 pthread_detach F
GLIBC_2.43 pthread_getattr_np F
GLIBC_2.43 pthread_getconcurrency F
diff --git a/sysdeps/mach/hurd/x86_64/libpthread.abilist
b/sysdeps/mach/hurd/x86_64/libpthread.abilist
index 77d9a6601d..d4ae93df53 100644
--- a/sysdeps/mach/hurd/x86_64/libpthread.abilist
+++ b/sysdeps/mach/hurd/x86_64/libpthread.abilist
@@ -17,7 +17,6 @@ GLIBC_2.38 mtx_lock F
GLIBC_2.38 mtx_timedlock F
GLIBC_2.38 mtx_trylock F
GLIBC_2.38 mtx_unlock F
-GLIBC_2.38 pthread_create F
GLIBC_2.38 pthread_hurd_cond_timedwait_np F
GLIBC_2.38 pthread_hurd_cond_wait_np F
GLIBC_2.38 pthread_spin_destroy F
--
2.51.0