Date: Sat, 27 Dec 2003 12:12:16 +0000 From: Doug Rabson <dfr@nlsystems.com> To: arch@freebsd.org Subject: sigaltstack with threads Message-ID: <1072527136.11617.17.camel@herring.nlsystems.com>
next in thread | raw e-mail | index | archive | help
I've been using my festive spare time in porting the excellent valgrind error checker to FreeBSD. While working through the complex way that valgrind deals with signals, I noticed a tricky problem. When a signal stack is installed in FreeBSD, the stack location is recorded in the per-process state (p_sigstk to be exact). This stack is used in sendsig() for signals handlers which asked for SA_ONSTACK. This is a problem for valgrind since it uses two threads (I use the thr_* syscalls for this purpose). The main thread does most of the work and wants to take a selection of signals (SIGSEGV, SIGBUS etc) on a signal stack allocated for the purpose - all other signals are blocked. The other thread is used for executing blocking syscalls (actually there can be more than one of these for pthread programs but I don't have that working yet). This syscall thread runs with something like the debugged program's normal signal mask so most of those signals get routed to the syscall thread. The main problem is that the syscall thread wants to take the signals on its normal stack but it can't use a different setting for sigaltstack. It seems to me that sigaltstack needs to be per-thread state, not per-process state otherwise it is essentially useless for threaded programs. As far as I can make out, this is the behaviour for Linux threads created using their clone syscall.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1072527136.11617.17.camel>