#
151316 |
|
14-Oct-2005 |
davidxu |
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
|
#
56046 |
|
15-Jan-2000 |
newton |
Fix handling of svr4_sigsets, which are implemented in SysVR4 as a sequence of 4 longs used as a bitmask. sv4r4_sigfillset has been broken for a while, probably since rev 1.5.
This patch fixes SVR4_NSIG (i.e.: sets it to the actual number of signals, instead of the number of bits in the mask) because some SysVR4 clients honestly seem to care about whether bits in the signal mask are set for non-existant signals.
Additionally, the svr4_sigfillset macro has been replaced by a fully fledged function, because the macro didn't actually work (it returned an all-ones mask, but we don't want that: we want 0's set where FreeBSD doesn't actually have a signal which is the same as an SysVR4 signal, for example).
SysVR4 clients can now successfully ignore signals, although catching them remains problematic (see commit log message for rev1.13 of sys/i386/svr4/svr4_machdep.c for more info).
|