Date: Fri, 11 Jun 2004 02:06:08 -0400 (EDT) From: Daniel Eischen <eischen@vigrid.com> To: Sean McNeil <sean@mcneil.com> Cc: freebsd-threads@freebsd.org Subject: Re: signal handler priority issue Message-ID: <Pine.GSO.4.10.10406110203390.10340-100000@pcnet5.pcnet.com> In-Reply-To: <1086933194.38839.3.camel@server.mcneil.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 10 Jun 2004, Sean McNeil wrote: > On Thu, 2004-06-10 at 22:29, Daniel Eischen wrote: > > > > > > > > It can't keep going if there is a possibility that it can > > > > send the same thread another SIGUSR2. > > > > > > I don't follow. Sorry. > > > > If the master thread does: > > > > for (i = 0; i < 4; i++) { > > pthread_kill(slave, SIGUSR1); > > sem_wait(&slave_semaphore); > > pthread_kill(slave, SIGUSR2); > > } > > > > You can see that there is a potential race condition where > > the slave thread gets SIGUSR1 and SIGUSR2 very close together. > > It is even possible to get them together in one sigsuspend() > > (if they are both unmasked in the suspend mask). > > > > You could fix the race by blocking SIGUSR1 from within > > the signal handler (like I described in my last email). > > I take it then that when a signal handler is invoked that it's signal > isn't masked while running. It isn't like a standard hardware interrupt > then. I'm trying as you suggest and will post results. Like I said before, it depends on the mask of the installed signal handler (sigact.sa_mask). You should use sigaction() and not signal() to get the desired behavior. You're other output looked strange. I was expecting the "restart" count to start at 1, not 2. -- Dan Eischen
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.10.10406110203390.10340-100000>