Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 09 Jan 2013 20:28:17 -0800
From:      Richard Sharpe <rsharpe@richardsharpe.com>
To:        David Xu <davidxu@freebsd.org>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Is it possible to block pending queued RealTime signals (AIO originating)?
Message-ID:  <1357792097.8329.9.camel@localhost.localdomain>
In-Reply-To: <50ECD0C2.7090801@freebsd.org>
References:  <1357608470.6752.22.camel@localhost.localdomain> <50EB888A.2030802@freebsd.org> <1357626838.6752.27.camel@localhost.localdomain> <50EBC480.8000306@freebsd.org> <1357661646.6752.30.camel@localhost.localdomain> <1357686894.6752.37.camel@localhost.localdomain> <50ECD0C2.7090801@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 2013-01-09 at 10:06 +0800, David Xu wrote:
> [...]
> >>> This code won't work, as I said, after the signal handler returned,
> >>> kernel will copy the signal mask contained in ucontext into kernel
> >>> space, and use it in feature signal delivering.
> >>>
> >>> The code should be modified as following:
> >>>
> >>> void handler(int signum, siginfo_t *info, ucontext_t *uap)
> >>> {
> >>> ...
> >>>
> >>> 	if (count + 1 == TEVENT_SA_INFO_QUEUE_COUNT) {
> >>> 		sigaddset(&uap->uc_sigmask, signum);
> >>
> >> Hmmm, this seems unlikely because the signal handler is operating in
> >> user mode and has no access to kernel-mode variables.
> >
> > Well, it turns out that your suggestion was correct.
> >
> > I did some more searching and found another similar suggestion, so I
> > gave it a whirl, and it works.
> >
> > Now, my problem is that Jeremy Allison thinks that it is a fugly hack.
> > This means that I will probably have big problems getting a patch for
> > this into Samba.
> >
> > I guess a couple of questions I have now are:
> >
> > 1. Is this the same for all versions of FreeBSD since Posix RT Signals
> > were introduced?
> >
> 
> I have checked source code, and found from FreeBSD 7.0, RT signal is
> supported, and aio code uses signal queue.
> 
> > 2. Which (interpretation of which) combination of standards require such
> > an approach?
> >
> >
> The way I introduced is standard:
> http://pubs.opengroup.org/onlinepubs/007904975/functions/sigaction.html
> 
> I quoted some text here:
> 
> When a signal is caught by a signal-catching function installed by 
> sigaction(), a new signal mask is calculated and installed for the 
> duration of the signal-catching function (or until a call to either 
> sigprocmask() or sigsuspend() is made). This mask is formed by taking 
> the union of the current signal mask and the value of the sa_mask for 
> the signal being delivered [XSI] [Option Start]  unless SA_NODEFER or 
> SA_RESETHAND is set, [Option End] and then including the signal being 
> delivered. If and when the user's signal handler returns normally, the 
> original signal mask is restored.
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> ...
> 
> When the signal handler returns, the receiving thread resumes execution 
> at the point it was interrupted unless the signal handler makes other 
> arrangements. If longjmp() or _longjmp() is used to leave the signal 
> handler, then the signal mask must be explicitly restored.
> 
> This volume of IEEE Std 1003.1-2001 defines the third argument of a 
> signal handling function when SA_SIGINFO is set as a void * instead of a 
> ucontext_t *, but without requiring type checking. New applications 
> should explicitly cast the third argument of the signal handling
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> function to ucontext_t *.
> ^^^^^^^^^^^^^^^^^^^^^^^^^
> 
> ---
> 
> The above means third parameter is pointing to ucontext_t which is used
> to restored the previously interrupted context, the context contains
> a signal mask which is also restored.
> http://pubs.opengroup.org/onlinepubs/007904975/basedefs/ucontext.h.html

OK, thank you for that. Jeremy agrees that this is a portable approach,
at least across Linux, FreeBSD and Solaris. We will try to get a fix
into Samba to do it the correct way.




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1357792097.8329.9.camel>