Avoid reference to glibc internal __libc_fork function.

This commit is contained in:
Alexandre Julliard 2002-10-22 00:44:24 +00:00
parent 9abcad524c
commit 26fd740d9c
4 changed files with 30 additions and 43 deletions

2
configure vendored
View file

@ -11457,11 +11457,9 @@ fi
for ac_func in \ for ac_func in \
__libc_fork \
_lwp_create \ _lwp_create \
_pclose \ _pclose \
_popen \ _popen \

View file

@ -909,7 +909,6 @@ dnl **** Check for functions ****
AC_FUNC_ALLOCA() AC_FUNC_ALLOCA()
AC_CHECK_FUNCS(\ AC_CHECK_FUNCS(\
__libc_fork \
_lwp_create \ _lwp_create \
_pclose \ _pclose \
_popen \ _popen \

View file

@ -650,9 +650,6 @@
/* Define to 1 if you have the `_strnicmp' function. */ /* Define to 1 if you have the `_strnicmp' function. */
#undef HAVE__STRNICMP #undef HAVE__STRNICMP
/* Define to 1 if you have the `__libc_fork' function. */
#undef HAVE___LIBC_FORK
/* Define if we have __va_copy */ /* Define if we have __va_copy */
#undef HAVE___VA_COPY #undef HAVE___VA_COPY

View file

@ -38,13 +38,6 @@
#include "thread.h" #include "thread.h"
#include "winternl.h" #include "winternl.h"
static int init_done;
void PTHREAD_init_done(void)
{
init_done = 1;
}
/* Currently this probably works only for glibc2, /* Currently this probably works only for glibc2,
* which checks for the presence of double-underscore-prepended * which checks for the presence of double-underscore-prepended
* pthread primitives, and use them if available. * pthread primitives, and use them if available.
@ -62,28 +55,18 @@ void PTHREAD_init_done(void)
asm(".globl " PSTR(alias) "\n" \ asm(".globl " PSTR(alias) "\n" \
"\t.set " PSTR(alias) "," PSTR(orig)) "\t.set " PSTR(alias) "," PSTR(orig))
/* strong_alias does not work on external symbols (.o format limitation?), static int init_done;
* so for those, we need to use the pogo stick */
#if defined(__i386__) && !defined(__PIC__)
/* FIXME: PIC */
#define jump_alias(orig, alias) __ASM_GLOBAL_FUNC( alias, "jmp " PSTR(orig))
#endif
/* get necessary libc symbols */ static pid_t (*libc_fork)(void);
#if (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1) && defined(HAVE___LIBC_FORK) static int (*libc_sigaction)(int signum, const struct sigaction *act, struct sigaction *oldact);
#define LIBC_FORK __libc_fork
#define PTHREAD_FORK __fork void PTHREAD_init_done(void)
#define ALIAS_FORK {
#else init_done = 1;
#define LIBC_FORK __fork if (!libc_fork) libc_fork = dlsym( RTLD_NEXT, "fork" );
#define PTHREAD_FORK fork if (!libc_sigaction) libc_sigaction = dlsym( RTLD_NEXT, "sigaction" );
#endif }
extern pid_t LIBC_FORK(void);
#define LIBC_SIGACTION __sigaction
extern int LIBC_SIGACTION(int signum,
const struct sigaction *act,
struct sigaction *oldact);
/* NOTE: This is a truly extremely incredibly ugly hack! /* NOTE: This is a truly extremely incredibly ugly hack!
* But it does seem to work... */ * But it does seem to work... */
@ -255,15 +238,20 @@ int __pthread_atfork(void (*prepare)(void),
} }
strong_alias(__pthread_atfork, pthread_atfork); strong_alias(__pthread_atfork, pthread_atfork);
pid_t PTHREAD_FORK(void) pid_t __fork(void)
{ {
pid_t pid; pid_t pid;
int i; int i;
if (!libc_fork)
{
libc_fork = dlsym( RTLD_NEXT, "fork" );
assert( libc_fork );
}
EnterCriticalSection( &atfork_section ); EnterCriticalSection( &atfork_section );
/* prepare handlers are called in reverse insertion order */ /* prepare handlers are called in reverse insertion order */
for (i = atfork_count - 1; i >= 0; i--) if (atfork_prepare[i]) atfork_prepare[i](); for (i = atfork_count - 1; i >= 0; i--) if (atfork_prepare[i]) atfork_prepare[i]();
if (!(pid = LIBC_FORK())) if (!(pid = libc_fork()))
{ {
InitializeCriticalSection( &atfork_section ); InitializeCriticalSection( &atfork_section );
for (i = 0; i < atfork_count; i++) if (atfork_child[i]) atfork_child[i](); for (i = 0; i < atfork_count; i++) if (atfork_child[i]) atfork_child[i]();
@ -275,9 +263,7 @@ pid_t PTHREAD_FORK(void)
} }
return pid; return pid;
} }
#ifdef ALIAS_FORK strong_alias(__fork, fork);
strong_alias(PTHREAD_FORK, fork);
#endif
/***** MUTEXES *****/ /***** MUTEXES *****/
@ -658,13 +644,20 @@ int pthread_setcanceltype(int type, int *oldtype)
/***** ANTI-OVERRIDES *****/ /***** ANTI-OVERRIDES *****/
/* pthreads tries to override these, point them back to libc */ /* pthreads tries to override these, point them back to libc */
#ifdef jump_alias
jump_alias(LIBC_SIGACTION, sigaction);
#else
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact)
{ {
return LIBC_SIGACTION(signum, act, oldact); if (!libc_sigaction)
{
libc_sigaction = dlsym( RTLD_NEXT, "sigaction" );
assert( libc_sigaction );
}
return libc_sigaction(signum, act, oldact);
}
#else /* __GLIBC__ */
void PTHREAD_init_done(void)
{
} }
#endif
#endif /* __GLIBC__ */ #endif /* __GLIBC__ */