diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/internal/libc.h | 3 | ||||
-rw-r--r-- | src/thread/pthread_create.c | 11 | ||||
-rw-r--r-- | src/time/timer_create.c | 4 |
3 files changed, 6 insertions, 12 deletions
diff --git a/src/internal/libc.h b/src/internal/libc.h index 6828f8b6..b80cbcc9 100644 --- a/src/internal/libc.h +++ b/src/internal/libc.h @@ -10,13 +10,12 @@ struct __libc { void (*lock)(volatile int *); void (*lockfile)(FILE *); void (*fork_handler)(int); - void (*sigtimer)(); + int (*rsyscall)(int, long, long, long, long, long, long); int (*atexit)(void (*)(void)); void (*fini)(void); void (*ldso_fini)(void); volatile int threads_minus_1; int ofl_lock; - int (*rsyscall)(int, long, long, long, long, long, long); FILE *ofl_head; }; diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index 6f1bb0e8..d058a1ad 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -4,6 +4,7 @@ static void dummy_1(pthread_t self) { } weak_alias(dummy_1, __pthread_tsd_run_dtors); +weak_alias(dummy_1, __sigtimer_handler); #ifdef __pthread_unwind_next #undef __pthread_unwind_next @@ -47,13 +48,9 @@ static void docancel(struct pthread *self) static void cancel_handler(int sig, siginfo_t *si, void *ctx) { struct pthread *self = __pthread_self(); - if (!self->cancel) { - if (si->si_code == SI_TIMER && libc.sigtimer) - libc.sigtimer(sig, si, ctx); - return; - } - if (self->canceldisable) return; - if (self->cancelasync || (self->cancelpoint==1 && PC_AT_SYS(ctx))) + if (si->si_code == SI_TIMER) __sigtimer_handler(self); + if (self->cancel && !self->canceldisable && + (self->cancelasync || (self->cancelpoint==1 && PC_AT_SYS(ctx)))) docancel(self); } diff --git a/src/time/timer_create.c b/src/time/timer_create.c index c5894f48..f02abb86 100644 --- a/src/time/timer_create.c +++ b/src/time/timer_create.c @@ -13,10 +13,9 @@ struct start_args { struct sigevent *sev; }; -static void sighandler(int sig, siginfo_t *si, void *ctx) +void __sigtimer_handler(pthread_t self) { int st; - pthread_t self = __pthread_self(); void (*notify)(union sigval) = (void (*)(union sigval))self->start; union sigval val = { .sival_ptr = self->start_arg }; @@ -72,7 +71,6 @@ int timer_create(clockid_t clk, struct sigevent *evp, timer_t *res) *res = (void *)(2*timerid+1); break; case SIGEV_THREAD: - if (!libc.sigtimer) libc.sigtimer = sighandler; if (sev.sigev_notify_attributes) attr = *sev.sigev_notify_attributes; else |