forked from OSchip/llvm-project
tsan: remember and pass original ucontext to signal handlers (instead of a fabricated one)
llvm-svn: 159278
This commit is contained in:
parent
70f11f88e3
commit
b94a8f0c39
|
@ -33,7 +33,7 @@ struct sigset_t {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ucontext_t {
|
struct ucontext_t {
|
||||||
u64 opaque[1024];
|
uptr opaque[117];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern "C" int pthread_attr_init(void *attr);
|
extern "C" int pthread_attr_init(void *attr);
|
||||||
|
@ -48,7 +48,6 @@ extern "C" int pthread_yield();
|
||||||
extern "C" int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
|
extern "C" int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
|
||||||
extern "C" int sigfillset(sigset_t *set);
|
extern "C" int sigfillset(sigset_t *set);
|
||||||
extern "C" void *pthread_self();
|
extern "C" void *pthread_self();
|
||||||
extern "C" int getcontext(ucontext_t *ucp);
|
|
||||||
extern "C" void _exit(int status);
|
extern "C" void _exit(int status);
|
||||||
extern "C" int __cxa_atexit(void (*func)(void *arg), void *arg, void *dso);
|
extern "C" int __cxa_atexit(void (*func)(void *arg), void *arg, void *dso);
|
||||||
extern "C" int *__errno_location();
|
extern "C" int *__errno_location();
|
||||||
|
@ -1289,6 +1288,8 @@ static void ALWAYS_INLINE rtl_generic_sighandler(bool sigact, int sig,
|
||||||
signal->sigaction = sigact;
|
signal->sigaction = sigact;
|
||||||
if (info)
|
if (info)
|
||||||
signal->siginfo = *info;
|
signal->siginfo = *info;
|
||||||
|
if (ctx)
|
||||||
|
signal->ctx = *(ucontext_t*)ctx;
|
||||||
sctx->pending_signal_count++;
|
sctx->pending_signal_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1381,9 +1382,7 @@ static void process_pending_signals(ThreadState *thr) {
|
||||||
thr->in_signal_handler = true;
|
thr->in_signal_handler = true;
|
||||||
sctx->pending_signal_count = 0;
|
sctx->pending_signal_count = 0;
|
||||||
// These are too big for stack.
|
// These are too big for stack.
|
||||||
static THREADLOCAL ucontext_t uctx;
|
|
||||||
static THREADLOCAL sigset_t emptyset, oldset;
|
static THREADLOCAL sigset_t emptyset, oldset;
|
||||||
getcontext(&uctx);
|
|
||||||
sigfillset(&emptyset);
|
sigfillset(&emptyset);
|
||||||
pthread_sigmask(SIG_SETMASK, &emptyset, &oldset);
|
pthread_sigmask(SIG_SETMASK, &emptyset, &oldset);
|
||||||
for (int sig = 0; sig < kSigCount; sig++) {
|
for (int sig = 0; sig < kSigCount; sig++) {
|
||||||
|
@ -1396,7 +1395,7 @@ static void process_pending_signals(ThreadState *thr) {
|
||||||
const int saved_errno = errno;
|
const int saved_errno = errno;
|
||||||
errno = 0;
|
errno = 0;
|
||||||
if (signal->sigaction)
|
if (signal->sigaction)
|
||||||
sigactions[sig].sa_sigaction(sig, &signal->siginfo, &uctx);
|
sigactions[sig].sa_sigaction(sig, &signal->siginfo, &signal->ctx);
|
||||||
else
|
else
|
||||||
sigactions[sig].sa_handler(sig);
|
sigactions[sig].sa_handler(sig);
|
||||||
if (errno != 0) {
|
if (errno != 0) {
|
||||||
|
|
Loading…
Reference in New Issue