Subject: Re: port-sparc64/29824
To: None <port-sparc64-maintainer@netbsd.org, gnats-admin@netbsd.org,>
From: Chuck Silvers <chuq@chuq.com>
List: netbsd-bugs
Date: 05/02/2005 15:07:01
The following reply was made to PR port-sparc64/29824; it has been noted by GNATS.
From: Chuck Silvers <chuq@chuq.com>
To: Matthias Scheler <tron@zhadum.de>
Cc: port-sparc64-maintainer@netbsd.org, xsrc-manager@netbsd.org,
netbsd-bugs@netbsd.org, NetBSD GNATS <gnats-bugs@netbsd.org>,
macallan18@earthlink.net
Subject: Re: port-sparc64/29824
Date: Mon, 2 May 2005 08:06:04 -0700
On Sun, May 01, 2005 at 10:44:20PM +0100, Matthias Scheler wrote:
> On Sun, May 01, 2005 at 02:37:17PM -0700, Chuck Silvers wrote:
> > > Responsible-Changed-From-To: xsrc-manager->port-sparc64-maintainer
> > > Responsible-Changed-By: tron@netbsd.org
> > > Responsible-Changed-When: Sun, 01 May 2005 18:14:03 +0000
> > > Responsible-Changed-Why:
> > > 1.) XFree86's signal handling code does *not* cause this. It will not
> > > unblock SIGIO from a the SIGIO signal handler.
> >
> > I just read the code again, it sure looks like it does to me.
> > the call stack in the initial PR comments looks like it could really happen.
>
> How?
sorry, I misread your comment. you're right that it does not unblock
SIGIO in the SIGIO handler, but that's not the problem. just calling
sigprocmask() in a signal handler is not safe, at least with our pthreads
implementation. I looked briefly for any mention in our manpages of
what library functions are or are not safe to call in a signal handler,
but I didn't find it.
-Chuck
> 1.) xf86BlockSIGIO() returns whether the signal has been blocked before:
>
> int
> xf86BlockSIGIO (void)
> {
> sigset_t set, old;
>
> sigemptyset (&set);
> sigaddset (&set, SIGIO);
> sigprocmask (SIG_BLOCK, &set, &old);
> return sigismember (&old, SIGIO);
> }
>
> 2.) xf86SigioReadInput() remembers that flag and passed it to
> xf86UnblockSIGIO():
>
> static void
> xf86SigioReadInput(int fd,
> void *closure)
> {
> int sigstate = xf86BlockSIGIO();
> [...]
> xf86UnblockSIGIO(sigstate);
> }
>
> 3.) void xf86UnblockSIGIO() only unblocks the signal if it has not been
> blocked before:
>
> void
> xf86UnblockSIGIO (int wasset)
> {
> sigset_t set;
>
> if (!wasset)
> {
> sigemptyset (&set);
> sigaddset (&set, SIGIO);
> sigprocmask (SIG_UNBLOCK, &set, NULL);
> }
> }
>
> That looks safe to me.
>
> Kind regards
>
> --
> Matthias Scheler http://scheler.de/~matthias/