Date: Mon, 9 Jul 2001 08:45:49 -0400 (EDT) From: Daniel Eischen <eischen@vigrid.com> To: Jason Evans <jasone@canonware.com> Cc: Julian Elischer <julian@elischer.org>, arch@FreeBSD.ORG Subject: Re: help needed in threads.. (Signals) Message-ID: <Pine.SUN.3.91.1010709082118.15060A-100000@pcnet1.pcnet.com> In-Reply-To: <20010708232131.O8775@canonware.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 8 Jul 2001, Jason Evans wrote:
> On Sun, Jul 08, 2001 at 10:51:19PM -0700, Julian Elischer wrote:
> > Can someone tell me if an alarm() call that sets an alarm signal for
> > some time in the futire (in a threaded environment, has teh signal delivered
> > to the process (an random thread), the same thread that made the request,
> > or a predesignated thread.. I just can't work out
> > what the right way to handle it in the code is..
> >
> > posix?
>
> Bwahaha, signals and threads.
>
> Each thread has its own signal mask. A signal sent to the process is
> delivered to a thread that doesn't have the signal masked (if any). If
> more than one thread has the signal unmasked, which thread receives the
> signal is undefined.
>
> That's what happens (or is supposed to happen). If you want to know the
> right way to do signal handling in threaded programs, that requires more
> explanation.
>
> Bwahaha.
:-)
Here is part of a log from a commit to uthread.c:
Modify the search for a thread to which a signal is delivered.
The search algorithm is now:
o First thread found in sigwait() with signal in wait mask.
o First thread found sigsuspend()'d on the signal.
o Current thread if signal is unmasked.
o First thread found with signal unmasked.
Note that the signal handler is not called if the thread is
in sigwait, but only called for the last 3 bullets. If a thread
isn't found that can handle the signal, then the signal gets
marked as pending for the process, and will be delivered to the
first thread to sigwait/sigsuspend on it, or to unmask the
signal.
For pthread_kill(), the signal is directed to a specific thread.
If the signal is masked in the thread, then it is marked as pending
for that thread and will be delivered when the thread sigwaits/sigsuspends
on it or unmasks it. If the process action is SIG_DFL for the signal,
then the signal also gets delivered to the process. This surprises a
few people when their program aborts ;-)
You can use both sigprocmask and pthread_sigmask to set the signal
mask of the current thread; they both behave the same way in a
threaded environment.
--
Dan Eischen
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.SUN.3.91.1010709082118.15060A-100000>
