Avoid reference to glibc internal __libc_fork function.
This commit is contained in:
parent
9abcad524c
commit
26fd740d9c
|
@ -11457,11 +11457,9 @@ fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for ac_func in \
|
for ac_func in \
|
||||||
__libc_fork \
|
|
||||||
_lwp_create \
|
_lwp_create \
|
||||||
_pclose \
|
_pclose \
|
||||||
_popen \
|
_popen \
|
||||||
|
|
|
@ -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 \
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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__ */
|
||||||
|
|
Loading…
Reference in New Issue