X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fthread%2Fpthread_cancel.c;h=2f9d5e975f22ca60e7e9baca84b97bb6378fccac;hb=b19fa247831bedd78fe4a671786883a25ddb6ca1;hp=c4631f0817ac8049fef58605219098634c931173;hpb=36e8b6a28be5d4ffad966386b1e1c0d0dc6ca11a;p=musl diff --git a/src/thread/pthread_cancel.c b/src/thread/pthread_cancel.c index c4631f08..2f9d5e97 100644 --- a/src/thread/pthread_cancel.c +++ b/src/thread/pthread_cancel.c @@ -2,12 +2,8 @@ #include #include "pthread_impl.h" #include "syscall.h" -#include "libc.h" -#ifdef SHARED -__attribute__((__visibility__("hidden"))) -#endif -long __cancel(), __syscall_cp_asm(), __syscall_cp_c(); +hidden long __cancel(), __syscall_cp_asm(), __syscall_cp_c(); long __cancel() { @@ -47,10 +43,7 @@ static void _sigaddset(sigset_t *set, int sig) set->__bits[s/8/sizeof *set->__bits] |= 1UL<<(s&8*sizeof *set->__bits-1); } -#ifdef SHARED -__attribute__((__visibility__("hidden"))) -#endif -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) { @@ -65,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; } @@ -96,5 +92,10 @@ int pthread_cancel(pthread_t t) init = 1; } a_store(&t->cancel, 1); + if (t == pthread_self()) { + if (t->canceldisable == PTHREAD_CANCEL_ENABLE && t->cancelasync) + pthread_exit(PTHREAD_CANCELED); + return 0; + } return pthread_kill(t, SIGCANCEL); }