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