use weak aliases rather than function pointers to simplify some code

This commit is contained in:
Rich Felker
2011-08-06 20:09:51 -04:00
parent 338b663ddb
commit 98acf04fc0
6 changed files with 20 additions and 9 deletions

View File

@ -6,10 +6,8 @@
struct __libc { struct __libc {
int *(*errno_location)(void); int *(*errno_location)(void);
void (*testcancel)(void);
int threaded; int threaded;
int canceldisable; int canceldisable;
void (*fork_handler)(int);
int (*atexit)(void (*)(void)); int (*atexit)(void (*)(void));
void (*fini)(void); void (*fini)(void);
void (*ldso_fini)(void); void (*ldso_fini)(void);

View File

@ -3,10 +3,16 @@
#include "libc.h" #include "libc.h"
#include "pthread_impl.h" #include "pthread_impl.h"
static void dummy(int x)
{
}
weak_alias(dummy, __fork_handler);
pid_t fork(void) pid_t fork(void)
{ {
pid_t ret; pid_t ret;
if (libc.fork_handler) libc.fork_handler(-1); __fork_handler(-1);
ret = syscall(SYS_fork); ret = syscall(SYS_fork);
if (libc.main_thread && !ret) { if (libc.main_thread && !ret) {
pthread_t self = __pthread_self(); pthread_t self = __pthread_self();
@ -15,6 +21,6 @@ pid_t fork(void)
libc.threads_minus_1 = 0; libc.threads_minus_1 = 0;
libc.main_thread = self; libc.main_thread = self;
} }
if (libc.fork_handler) libc.fork_handler(!ret); __fork_handler(!ret);
return ret; return ret;
} }

View File

@ -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); weak_alias(sccp, __syscall_cp);
static void dummy()
{
}
weak_alias(dummy, __testcancel);

View File

@ -58,7 +58,7 @@ static void cancel_handler(int sig, siginfo_t *si, void *ctx)
__syscall(SYS_tgkill, self->pid, self->tid, SIGCANCEL); __syscall(SYS_tgkill, self->pid, self->tid, SIGCANCEL);
} }
static void testcancel() void __testcancel()
{ {
pthread_t self = __pthread_self(); pthread_t self = __pthread_self();
if (self->cancel && !self->canceldisable) if (self->cancel && !self->canceldisable)
@ -73,7 +73,6 @@ static void init_cancellation()
}; };
sigfillset(&sa.sa_mask); sigfillset(&sa.sa_mask);
__libc_sigaction(SIGCANCEL, &sa, 0); __libc_sigaction(SIGCANCEL, &sa, 0);
libc.testcancel = testcancel;
} }
int pthread_cancel(pthread_t t) int pthread_cancel(pthread_t t)

View File

@ -10,9 +10,10 @@ static struct atfork_funcs {
static int lock; static int lock;
static void fork_handler(int who) void __fork_handler(int who)
{ {
struct atfork_funcs *p; struct atfork_funcs *p;
if (!funcs) return;
if (who < 0) { if (who < 0) {
LOCK(&lock); LOCK(&lock);
for (p=funcs; p; p = p->next) { 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; if (!new) return -1;
LOCK(&lock); LOCK(&lock);
libc.fork_handler = fork_handler;
new->next = funcs; new->next = funcs;
new->prev = 0; new->prev = 0;
new->prepare = prepare; new->prepare = prepare;

View File

@ -1,6 +1,8 @@
#include "pthread_impl.h" #include "pthread_impl.h"
void __testcancel(void);
void pthread_testcancel() void pthread_testcancel()
{ {
if (libc.testcancel) libc.testcancel(); __testcancel();
} }