X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fthread%2Fpthread_cancel.c;h=2f9d5e975f22ca60e7e9baca84b97bb6378fccac;hb=21a172dd36cae7a08492fd3a7500d7bf0daee13e;hp=3d229223ed1b00f622c3319b7cfa327086f530d7;hpb=aecda35373511c5bf02c0f708bd262adb1a09287;p=musl diff --git a/src/thread/pthread_cancel.c b/src/thread/pthread_cancel.c index 3d229223..2f9d5e97 100644 --- a/src/thread/pthread_cancel.c +++ b/src/thread/pthread_cancel.c @@ -2,10 +2,8 @@ #include #include "pthread_impl.h" #include "syscall.h" -#include "libc.h" -__attribute__((__visibility__("hidden"))) -long __cancel(), __syscall_cp_asm(), __syscall_cp_c(); +hidden long __cancel(), __syscall_cp_asm(), __syscall_cp_c(); long __cancel() { @@ -45,8 +43,7 @@ static void _sigaddset(sigset_t *set, int sig) set->__bits[s/8/sizeof *set->__bits] |= 1UL<<(s&8*sizeof *set->__bits-1); } -__attribute__((__visibility__("hidden"))) -extern const char __cp_begin[1], __cp_end[1], __cp_cancel[1]; +extern hidden const char __cp_begin[1], __cp_end[1], __cp_cancel[1]; static void cancel_handler(int sig, siginfo_t *si, void *ctx) { @@ -61,6 +58,9 @@ static void cancel_handler(int sig, siginfo_t *si, void *ctx) if (self->cancelasync || pc >= (uintptr_t)__cp_begin && pc < (uintptr_t)__cp_end) { uc->uc_mcontext.MC_PC = (uintptr_t)__cp_cancel; +#ifdef CANCEL_GOT + uc->uc_mcontext.MC_GOT = CANCEL_GOT; +#endif return; } @@ -92,6 +92,10 @@ int pthread_cancel(pthread_t t) init = 1; } a_store(&t->cancel, 1); - if (t == pthread_self() && !t->cancelasync) return 0; + if (t == pthread_self()) { + if (t->canceldisable == PTHREAD_CANCEL_ENABLE && t->cancelasync) + pthread_exit(PTHREAD_CANCELED); + return 0; + } return pthread_kill(t, SIGCANCEL); }