From 3fbdb3c21524d9d95278ada1d61b4d1e6bee654b Mon Sep 17 00:00:00 2001 From: davidxu Date: Fri, 14 Oct 2005 12:43:47 +0000 Subject: 1. Change prototype of trapsignal and sendsig to use ksiginfo_t *, most changes in MD code are trivial, before this change, trapsignal and sendsig use discrete parameters, now they uses member fields of ksiginfo_t structure. For sendsig, this change allows us to pass POSIX realtime signal value to user code. 2. Remove cpu_thread_siginfo, it is no longer needed because we now always generate ksiginfo_t data and feed it to libpthread. 3. Add p_sigqueue to proc structure to hold shared signals which were blocked by all threads in the proc. 4. Add td_sigqueue to thread structure to hold all signals delivered to thread. 5. i386 and amd64 now return POSIX standard si_code, other arches will be fixed. 6. In this sigqueue implementation, pending signal set is kept as before, an extra siginfo list holds additional siginfo_t data for signals. kernel code uses psignal() still behavior as before, it won't be failed even under memory pressure, only exception is when deleting a signal, we should call sigqueue_delete to remove signal from sigqueue but not SIGDELSET. Current there is no kernel code will deliver a signal with additional data, so kernel should be as stable as before, a ksiginfo can carry more information, for example, allow signal to be delivered but throw away siginfo data if memory is not enough. SIGKILL and SIGSTOP have fast path in sigqueue_add, because they can not be caught or masked. The sigqueue() syscall allows user code to queue a signal to target process, if resource is unavailable, EAGAIN will be returned as specification said. Just before thread exits, signal queue memory will be freed by sigqueue_flush. Current, all signals are allowed to be queued, not only realtime signals. Earlier patch reviewed by: jhb, deischen Tested on: i386, amd64 --- sys/i386/svr4/svr4_machdep.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'sys/i386/svr4') diff --git a/sys/i386/svr4/svr4_machdep.c b/sys/i386/svr4/svr4_machdep.c index 3b731a2..cc03dee 100644 --- a/sys/i386/svr4/svr4_machdep.c +++ b/sys/i386/svr4/svr4_machdep.c @@ -411,11 +411,10 @@ svr4_getsiginfo(si, sig, code, addr) * will return to the user pc, psl. */ void -svr4_sendsig(catcher, sig, mask, code) +svr4_sendsig(catcher, ksi, mask) sig_t catcher; - int sig; + ksiginfo_t ksi; sigset_t *mask; - u_long code; { register struct thread *td = curthread; struct proc *p = td->td_proc; @@ -423,11 +422,15 @@ svr4_sendsig(catcher, sig, mask, code) struct svr4_sigframe *fp, frame; struct sigacts *psp; int oonstack; + int sig; + int code; #if defined(DEBUG_SVR4) printf("svr4_sendsig(%d)\n", sig); #endif PROC_LOCK_ASSERT(p, MA_OWNED); + sig = ksi->ksi_signo; + code = ksi->ksi_trapno; /* use trap No. */ psp = p->p_sigacts; mtx_assert(&psp->ps_mtx, MA_OWNED); -- cgit v1.1