Date: Sun, 21 Mar 2010 13:22:24 -0400 From: Pierre-Luc Drouin <pldrouin@pldrouin.net> To: Daniel Eischen <deischen@freebsd.org> Cc: freebsd-threads@freebsd.org Subject: Re: Portable Conditional Wait for Inter-Process? Message-ID: <4BA655D0.4040002@pldrouin.net> In-Reply-To: <Pine.GSO.4.64.1003211246350.5093@sea.ntplx.net> References: <4BA64260.5000009@pldrouin.net> <Pine.GSO.4.64.1003211246350.5093@sea.ntplx.net>
next in thread | previous in thread | raw e-mail | index | archive | help
Daniel Eischen wrote: > On Sun, 21 Mar 2010, Pierre-Luc Drouin wrote: > >> Hi, >> >> I am looking for a portable solution to put a process into a timed >> wait (a la pthread_cond_timedwait) such that it can be waken up by >> another process using something similar to pthread_cond_broadcast >> (there might be many waiters). I guess shared pthread condition >> variables are not supported by FreeBSD, right? Is there a portable >> way to do this? The only solution I can think of right now is to use >> alarm and sigwait on the waiters side and kill(wpid,SIGCONT) on the >> other side with a list of pids. > > Yeah, shared mutexes and CVs are not yet supported by FreeBSD. > You can use sigtimedwait() to conditionally sleep and kill > on the other side, but with caveats: > > o Only one thread per process can be woken with > sigwait() and friends > > o You must ensure that no other threads (other than > the waiter) have the "wake" signal unmasked. This should not be a problem in my case.. > > You might consider using killpg() to send a signal to > multiple processes in a process group. yes this is a good idea > > FreeBSD current (9.0) recently added support for shared semapores, > so you could give those a try. You might be able to use > sem_timedwait() instead of pthread_cond_timedwait() depending on > your needs, but you are limited to waking only one thread > at a time via sem_post(). yeah semaphores would not be ideal for my application... I would also prefer to stick with 8.0 for now... > > You could also have a pipe or domain socket between the sender > and each waiting processes. I suppose you could use aio_write() > on the sender side to write to selected file descriptors with > one operation. The waiters would be using poll() or select() > with a timeout. > Thanks for all the good ideas!
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4BA655D0.4040002>