Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Oct 2000 15:58:59 -0700
From:      Alfred Perlstein <bright@wintelcom.net>
To:        Flemming Froekjaer <froekjaerf@netscape.net>
Cc:        freebsd-questions@freebsd.org
Subject:   Re: SIG codes > 128 allowed?
Message-ID:  <20001023155858.W28123@fw.wintelcom.net>
In-Reply-To: <0963B774.2A753185.0F2A144B@netscape.net>; from froekjaerf@netscape.net on Mon, Oct 23, 2000 at 06:13:53PM -0400
References:  <641C2F90.19430A3A.0F2A144B@netscape.net> <20001023130415.U28123@fw.wintelcom.net> <0963B774.2A753185.0F2A144B@netscape.net>

next in thread | previous in thread | raw e-mail | index | archive | help
* Flemming Froekjaer <froekjaerf@netscape.net> [001023 15:14] wrote:
> 
> Alfred Perlstein <bright@wintelcom.net> wrote:
> >
> > * Flemming Froekjaer <froekjaerf@netscape.net> [001023 12:35] wrote:
> > > In signal.h, more precisely the struct __siginfo, si_code is defined as 
> an 
> > > integer, but the same include file also defines the constant _SIG_MAXSIG, 
> > > with a value of 128. Does this mean that FreeBSD won't allow signal codes 
> > > above 128, or can you use the whole positive spectrum of an integer?
> > > 
> > > The reason I ask is that I want to define a sighandler for every thread 
> in a 
> > > process. As you may know, threads share the parent process' signal 
> handlers, 
> > > so I'll need a unique signal code for each thread. I anticipate that the 
> > > number of threads per process will be about a thousand.
> > 
> > You'll want to find a better way to dispatch to each thread than to do
> > this.  You can use pthread_kill(3) to send a signal to a particular
> > thread.
> 
> At first I thought I'd overlooked something, but after doing some research 
> I've come to the conclusion that this still won't do it. You can send the 
> signal to a particular thread, alright, but if more than one thread has 
> unblocked that particular signal, it will subsequently be very difficult to 
> determine which thread the signal was directed at. Furthermore, the 
> process-level signal handler must block the signal in question while handling 
> it.

This can be solved a number of ways, one that comes to mind is 
using pthread_setspecific(3) and pthread_getspecific(3) to implement
your switch for what the signal means to each thread.

> What I aim for is true thread-level asynchronous I/O. I want independant, 
> event-driven threads, basically, where each thread has it's own signal 
> handler which can be invoked, regardless of process states, at any given time.
> Now, if I can safely use signals outside the kernel-defined range, all my 
> problems will be solved. I just assign a unique signal - and consequently a 
> unique signal handler - to each thread.

Each thread can also register it's own handler afaik, this means
that one can avoid the use of pthread_getspecific(3).

Btw, you can't do this, from src/sys/kern_sig.c:

int
kill(cp, uap)
	register struct proc *cp;
	register struct kill_args *uap;
{
	register struct proc *p;

	if ((u_int)uap->signum > _SIG_MAXSIG)
		return (EINVAL);

sorry.

> I'd love to use processes for this, but I'm afraid those are too costly for 
> this application. The need for speed and all that...

Using processes can work, but it makes IPC more costly and inconvient.

-- 
-Alfred Perlstein - [bright@wintelcom.net|alfred@freebsd.org]
"I have the heart of a child; I keep it in a jar on my desk."


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




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