mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-01 14:14:56 +00:00
Simplify signal handling code in libthr by removing use of SYS_sigreturn
The use of SYS_sigreturn is unnecessary here. If handle_signal is called when a signal is delivered, it can just return normally back to sigcode which will call sigreturn anyway. In case handle_signal is called by check_deferred_signal, using setcontext is better than SYS_sigreturn because that is the correct system call to pair with the earlier getcontext. Reviewed by: imp, kib Differential Revision: https://reviews.freebsd.org/D44893
This commit is contained in:
parent
c0c066f86d
commit
7cae020b9c
|
@ -247,7 +247,6 @@ static void
|
|||
handle_signal(struct sigaction *actp, int sig, siginfo_t *info, ucontext_t *ucp)
|
||||
{
|
||||
struct pthread *curthread = _get_curthread();
|
||||
ucontext_t uc2;
|
||||
__siginfohandler_t *sigfunc;
|
||||
int cancel_point;
|
||||
int cancel_async;
|
||||
|
@ -307,13 +306,11 @@ handle_signal(struct sigaction *actp, int sig, siginfo_t *info, ucontext_t *ucp)
|
|||
curthread->cancel_point = cancel_point;
|
||||
curthread->cancel_enable = cancel_enable;
|
||||
|
||||
memcpy(&uc2, ucp, sizeof(uc2));
|
||||
SIGDELSET(uc2.uc_sigmask, SIGCANCEL);
|
||||
SIGDELSET(ucp->uc_sigmask, SIGCANCEL);
|
||||
|
||||
/* reschedule cancellation */
|
||||
check_cancel(curthread, &uc2);
|
||||
check_cancel(curthread, ucp);
|
||||
errno = err;
|
||||
syscall(SYS_sigreturn, &uc2);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -400,6 +397,7 @@ check_deferred_signal(struct pthread *curthread)
|
|||
/* remove signal */
|
||||
curthread->deferred_siginfo.si_signo = 0;
|
||||
handle_signal(&act, info.si_signo, &info, uc);
|
||||
syscall(SYS_sigreturn, uc);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Reference in a new issue