1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00
* 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:
Ulrich Drepper
2002-12-15 20:06:34 +00:00
parent 8361400815
commit 8454830b08
6 changed files with 191 additions and 34 deletions

View File

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