Skip site navigation (1)Skip section navigation (2)
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>