diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/internal/libc.h | 2 | ||||
| -rw-r--r-- | src/process/fork.c | 10 | ||||
| -rw-r--r-- | src/thread/cancel_dummy.c | 6 | ||||
| -rw-r--r-- | src/thread/cancel_impl.c | 3 | ||||
| -rw-r--r-- | src/thread/pthread_atfork.c | 4 | ||||
| -rw-r--r-- | src/thread/pthread_testcancel.c | 4 | 
6 files changed, 20 insertions, 9 deletions
| diff --git a/src/internal/libc.h b/src/internal/libc.h index 929ff97a..07ed70cd 100644 --- a/src/internal/libc.h +++ b/src/internal/libc.h @@ -6,10 +6,8 @@  struct __libc {  	int *(*errno_location)(void); -	void (*testcancel)(void);  	int threaded;  	int canceldisable; -	void (*fork_handler)(int);  	int (*atexit)(void (*)(void));  	void (*fini)(void);  	void (*ldso_fini)(void); diff --git a/src/process/fork.c b/src/process/fork.c index 7530ff93..a8bdbe0b 100644 --- a/src/process/fork.c +++ b/src/process/fork.c @@ -3,10 +3,16 @@  #include "libc.h"  #include "pthread_impl.h" +static void dummy(int x) +{ +} + +weak_alias(dummy, __fork_handler); +  pid_t fork(void)  {  	pid_t ret; -	if (libc.fork_handler) libc.fork_handler(-1); +	__fork_handler(-1);  	ret = syscall(SYS_fork);  	if (libc.main_thread && !ret) {  		pthread_t self = __pthread_self(); @@ -15,6 +21,6 @@ pid_t fork(void)  		libc.threads_minus_1 = 0;  		libc.main_thread = self;  	} -	if (libc.fork_handler) libc.fork_handler(!ret); +	__fork_handler(!ret);  	return ret;  } diff --git a/src/thread/cancel_dummy.c b/src/thread/cancel_dummy.c index a39117e7..047692c4 100644 --- a/src/thread/cancel_dummy.c +++ b/src/thread/cancel_dummy.c @@ -6,3 +6,9 @@ static long sccp(long nr, long u, long v, long w, long x, long y, long z)  }  weak_alias(sccp, __syscall_cp); + +static void dummy() +{ +} + +weak_alias(dummy, __testcancel); diff --git a/src/thread/cancel_impl.c b/src/thread/cancel_impl.c index 9a02e1a1..4f78a63a 100644 --- a/src/thread/cancel_impl.c +++ b/src/thread/cancel_impl.c @@ -58,7 +58,7 @@ static void cancel_handler(int sig, siginfo_t *si, void *ctx)  		__syscall(SYS_tgkill, self->pid, self->tid, SIGCANCEL);  } -static void testcancel() +void __testcancel()  {  	pthread_t self = __pthread_self();  	if (self->cancel && !self->canceldisable) @@ -73,7 +73,6 @@ static void init_cancellation()  	};  	sigfillset(&sa.sa_mask);  	__libc_sigaction(SIGCANCEL, &sa, 0); -	libc.testcancel = testcancel;  }  int pthread_cancel(pthread_t t) diff --git a/src/thread/pthread_atfork.c b/src/thread/pthread_atfork.c index 0773dc8f..a7a82016 100644 --- a/src/thread/pthread_atfork.c +++ b/src/thread/pthread_atfork.c @@ -10,9 +10,10 @@ static struct atfork_funcs {  static int lock; -static void fork_handler(int who) +void __fork_handler(int who)  {  	struct atfork_funcs *p; +	if (!funcs) return;  	if (who < 0) {  		LOCK(&lock);  		for (p=funcs; p; p = p->next) { @@ -35,7 +36,6 @@ int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(vo  	if (!new) return -1;  	LOCK(&lock); -	libc.fork_handler = fork_handler;  	new->next = funcs;  	new->prev = 0;  	new->prepare = prepare; diff --git a/src/thread/pthread_testcancel.c b/src/thread/pthread_testcancel.c index c6b250b2..33238c0f 100644 --- a/src/thread/pthread_testcancel.c +++ b/src/thread/pthread_testcancel.c @@ -1,6 +1,8 @@  #include "pthread_impl.h" +void __testcancel(void); +  void pthread_testcancel()  { -	if (libc.testcancel) libc.testcancel(); +	__testcancel();  } | 
