Re: glib win32 condvar implementation

On Fri, 2006-08-25 at 10:14 +0200, Sebastian Wilhelmi wrote:
> Alex,
> > I was looking over the gthread win32 implementation today when doing
> > some dbus threading work, and i noticed what i think is a bug:
> >
> > In g_cond_wait_internal() we add the even to the event array in the
> > condvar, then we sleep on it. When we wake up or timeout we then remove
> > the event object from the array... Except we don't, we only do that in
> > the case of a timeout. I really think we always should remove it, and in
> > fact we should reset it always too, in case we got some extra wakeup
> > call inbetween.
> The technique is as follows: all condition variables are implemented
> as arrays, containing exactly one entry for every thread, waiting on
> that condition variable. This entry is a handle to a thread specific
> win32 Event. In g_cond_wait this entry is added to the array, and in
> g_cond_signal it is removed, before sending enabling event. Thus
> g_cond_wait only in case of a timeout has to be remove the entry from
> the array.
> This is done for two reasons. Firstly it is faster to remove the
> entry, while transversing the array. Secondly (and more importantly)
> it avoids the race condition, where an event is send twice by a
> g_cond_signal, before g_cond_wait comes around to remove the entry.
> This event will remain in the event queue and will thus be consumed by
> the next g_cond_wait, even though no g_cond_signal is called.

I see, i missed the removal in signal. Thanks for explaining.

 Alexander Larsson                                            Red Hat, Inc 
                   alexl redhat com    alla lysator liu se 
He's a gun-slinging Amish paranormal investigator with a robot buddy named 
Sparky. She's a scantily clad motormouth single mother with the soul of a 
mighty warrior. They fight crime! 

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]