about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/internal/libc.h2
-rw-r--r--src/process/fork.c10
-rw-r--r--src/thread/cancel_dummy.c6
-rw-r--r--src/thread/cancel_impl.c3
-rw-r--r--src/thread/pthread_atfork.c4
-rw-r--r--src/thread/pthread_testcancel.c4
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();
 }