Since the cause of the problems with the __fillcontextx() was

identified, unify the code of check_deferred_signal() for all
architectures, making the variant under #ifdef x86 common.

Tested by:	marius (sparc64)
Sponsored by:	The FreeBSD Foundation
MFC after:	2 weeks
This commit is contained in:
Konstantin Belousov 2013-06-03 04:22:42 +00:00
parent 07d46f9c18
commit 91ddaeb725

View File

@ -318,31 +318,23 @@ check_deferred_signal(struct pthread *curthread)
ucontext_t *uc;
struct sigaction act;
siginfo_t info;
int uc_len;
if (__predict_true(curthread->deferred_siginfo.si_signo == 0))
return;
#if defined(__amd64__) || defined(__i386__)
int uc_len;
uc_len = __getcontextx_size();
uc = alloca(uc_len);
getcontext(uc);
if (curthread->deferred_siginfo.si_signo == 0)
return;
__fillcontextx2((char *)uc);
#else
ucontext_t ucv;
uc = &ucv;
getcontext(uc);
#endif
if (curthread->deferred_siginfo.si_signo != 0) {
act = curthread->deferred_sigact;
uc->uc_sigmask = curthread->deferred_sigmask;
memcpy(&info, &curthread->deferred_siginfo, sizeof(siginfo_t));
/* remove signal */
curthread->deferred_siginfo.si_signo = 0;
handle_signal(&act, info.si_signo, &info, uc);
}
act = curthread->deferred_sigact;
uc->uc_sigmask = curthread->deferred_sigmask;
memcpy(&info, &curthread->deferred_siginfo, sizeof(siginfo_t));
/* remove signal */
curthread->deferred_siginfo.si_signo = 0;
handle_signal(&act, info.si_signo, &info, uc);
}
static void