Date: Tue, 8 Jan 2013 22:14:52 -0500 (EST) From: Daniel Eischen <deischen@freebsd.org> To: Richard Sharpe <rsharpe@richardsharpe.com> Cc: freebsd-hackers@freebsd.org, David Xu <davidxu@freebsd.org> Subject: Re: Is it possible to block pending queued RealTime signals (AIO originating)? Message-ID: <Pine.GSO.4.64.1301082208560.19271@sea.ntplx.net> In-Reply-To: <1357686894.6752.37.camel@localhost.localdomain> 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>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 8 Jan 2013, Richard Sharpe wrote: > [ ... ] > > 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 don't understand why JA thinks this is a hack. Their current method doesn't work, or at least isn't portable. I've tried this on Solaris 10, and it works just as it does in FreeBSD. Test program included after signature. $ ./test_sigprocmask Sending signal 16 Got signal 16, blocked: true Blocking signal 16 using method 0 Handled signal 16, blocked: false Sending signal 16 Got signal 16, blocked: true Blocking signal 16 using method 1 Handled signal 16, blocked: true -- DE #include <assert.h> #include <signal.h> #include <stdio.h> #include <ucontext.h> #include <unistd.h> #define SIGNAL_TO_USE SIGUSR1 static int got_signal = 0; static int method = 0; static char * signal_blocked_str(sigset_t *set) { if (sigismember(set, SIGNAL_TO_USE)) return ("true"); else return ("false"); } static void sighandler(int sig, int code, ucontext_t *ucp) { sigset_t set; sigprocmask(SIG_SETMASK, NULL, &set); printf("Got signal %d, blocked: %s\n", SIGNAL_TO_USE, signal_blocked_str(&set)); printf("Blocking signal %d using method %d\n", SIGNAL_TO_USE, method); if (method == 0) { sigaddset(&set, SIGNAL_TO_USE); sigprocmask(SIG_SETMASK, &set, NULL); } else sigaddset(&ucp->uc_sigmask, SIGNAL_TO_USE); got_signal = 1; } int main(int argc, char **argv) { sigset_t mask; struct sigaction act; /* Install the handler. */ sigemptyset(&act.sa_mask); sigaddset(&act.sa_mask, SIGNAL_TO_USE); act.sa_handler = sighandler; act.sa_flags = SA_SIGINFO; assert(sigaction(SIGNAL_TO_USE, &act, NULL) == 0); /* Unblock the signal. */ sigemptyset(&mask); sigaddset(&mask, SIGNAL_TO_USE); sigprocmask(SIG_UNBLOCK, &mask, NULL); printf("Sending signal %d\n", SIGNAL_TO_USE); kill(getpid(), SIGNAL_TO_USE); while (got_signal == 0) { sleep(1); } sigprocmask(SIG_SETMASK, NULL, &mask); printf("Handled signal %d, blocked: %s\n\n", SIGNAL_TO_USE, signal_blocked_str(&mask)); method = 1; printf("Sending signal %d\n", SIGNAL_TO_USE); kill(getpid(), SIGNAL_TO_USE); while (got_signal == 0) { sleep(1); } sigprocmask(SIG_SETMASK, NULL, &mask); printf("Handled signal %d, blocked: %s\n", SIGNAL_TO_USE, signal_blocked_str(&mask)); return (0); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.64.1301082208560.19271>