Re: glib win32 condvar implementation
- From: Alexander Larsson <alexl redhat com>
- To: Sebastian Wilhelmi <wilhelmi google com>
- Cc: "gtk-devel-list gnome org" <gtk-devel-list gnome org>
- Subject: Re: glib win32 condvar implementation
- Date: Fri, 25 Aug 2006 12:35:49 +0200
On Fri, 2006-08-25 at 10:14 +0200, Sebastian Wilhelmi wrote:
> > 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!
] [Thread Prev