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>