mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Update.
* init.c (pthread_functions): New variable. (__pthread_initialize_minimal): Pass pointer to pthread_functions (or NULL) to __libc_pthread_init. * forward.c: Rewrite to use __libc:pthread_functions array to get function addresses. * sysdeps/unix/sysv/linux/fork.h: Remove __libc_pthread_init prototype. * sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init): Take new parameter. Copy content of variable pointed to by it to __libc_pthread_init. * pthreadP.h (struct pthread_functions): New type. (__libc_pthread_init): Declare. * pthread_attr_destroy.c: Add namespace protected alias. * pthread_attr_getdetachstate.c: Likewise. * pthread_attr_getinheritsched.c: Likewise. * pthread_attr_getschedparam.c: Likewise. * pthread_attr_getschedpolicy.c: Likewise. * pthread_attr_getscope.c: Likewise. * pthread_attr_setdetachstate.c: Likewise. * pthread_attr_setinheritsched.c: Likewise. * pthread_attr_setschedparam.c: Likewise. * pthread_attr_setschedpolicy.c: Likewise. * pthread_attr_setscope.c: Likewise. * pthread_cond_broadcast.c: Likewise. * pthread_cond_destroy.c: Likewise. * pthread_cond_init.c: Likewise. * pthread_cond_signal.c: Likewise. * pthread_cond_wait.c: Likewise. * pthread_condattr_destroy.c: Likewise. * pthread_condattr_init.c: Likewise. * pthread_equal.c: Likewise. * pthread_exit.c: Likewise. * pthread_getschedparam.c: Likewise. * pthread_self.c: Likewise. * pthread_setcancelstate.c: Likewise. * pthread_setschedparam.c: Likewise. * pthread_mutex_destroy.c: Likewise. * pthread_mutex_init.c: Likewise. * pthreadP.h: Add prototypes for the aliases.
This commit is contained in:
@ -18,51 +18,33 @@
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <pthread.h>
|
||||
#include <pthreadP.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <shlib-compat.h>
|
||||
#include <atomic.h>
|
||||
|
||||
|
||||
/* Pointers to the libc functions. */
|
||||
struct pthread_functions __libc_pthread_functions attribute_hidden;
|
||||
|
||||
|
||||
#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2)
|
||||
static void *libpthread_handle;
|
||||
|
||||
|
||||
static void
|
||||
test_loaded (void)
|
||||
{
|
||||
/* While we are getting the result set the handle to (void *) -1 to
|
||||
avoid recursive calls. */
|
||||
atomic_compare_and_exchange_acq (&libpthread_handle, (void *) -1l, NULL);
|
||||
|
||||
void *h = __libc_dlopen_mode ("libpthread.so.0", RTLD_LAZY | RTLD_NOLOAD);
|
||||
|
||||
libpthread_handle = h ?: (void *) -1l;
|
||||
}
|
||||
|
||||
|
||||
#define FORWARD3(name, rettype, decl, params, defaction, version) \
|
||||
# define FORWARD3(name, rettype, decl, params, defaction, version) \
|
||||
rettype \
|
||||
__noexport_##name decl \
|
||||
{ \
|
||||
if (libpthread_handle == NULL) \
|
||||
test_loaded (); \
|
||||
\
|
||||
if (libpthread_handle == (void *) -1l) \
|
||||
if (__libc_pthread_functions.ptr_##name == NULL) \
|
||||
defaction; \
|
||||
\
|
||||
static __typeof (name) *p; \
|
||||
p = __libc_dlsym (libpthread_handle, #name); \
|
||||
\
|
||||
return p params; \
|
||||
return __libc_pthread_functions.ptr_##name params; \
|
||||
} \
|
||||
compat_symbol (libc, __noexport_##name, name, version)
|
||||
|
||||
#define FORWARD2(name, decl, params, defretval, version) \
|
||||
# define FORWARD2(name, decl, params, defretval, version) \
|
||||
FORWARD3 (name, int, decl, params, return defretval, version)
|
||||
|
||||
#define FORWARD(name, decl, params, defretval) \
|
||||
# define FORWARD(name, decl, params, defretval) \
|
||||
FORWARD2 (name, decl, params, defretval, GLIBC_2_0)
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user