mirror of
https://github.com/fluencelabs/musl
synced 2025-06-23 03:31:55 +00:00
use weak aliases rather than function pointers to simplify some code
This commit is contained in:
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user