htl: move pthread_create to into libc

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.
This commit is contained in:
Samuel Thibault 2025-11-16 14:09:11 +00:00
parent f63dd92431
commit 5b6ee0e0ba
10 changed files with 43 additions and 40 deletions

View File

@ -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 \

View File

@ -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;
}
}

View File

@ -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)

View File

@ -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);

View File

@ -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, \

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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