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