Thanks David, changes now merged and submitted to svn/trunk and OSG-2.8 branch.

On Thu, Jul 2, 2009 at 2:53 PM, David Fries<[email protected]> wrote:
> Here is a fix for a deadlock seen under Windows using OpenThreads
> Barrier operations.  The error is with atomic operations in the
> win32 condition implementation.  The attached sample program will
> reliably trigger with as few as three threads and a dual core system,
> though sometimes it will take 65,000 iterations.
>
> 2.8.1 was the base for these changes
>
> Win32ConditionPrivateData.h
> Win32ConditionPrivateData::wait does two operations to decrement
> waiters_ then read, when InterlockedDecrement decrements and returns
> the value in one operation.  The two operations allows another thread
> to also decrement with both getting 0 for an answer.
>
> Win32ConditionPrivateData::broadcast is using waiters_ directly
> instead of using the w value read earlier, if it was safe to use
> waiters_ directly there would be no need for InterlockedGet or w.
>
> overview of deadlock in barrier with three threads
> one thread in broadcast, 2 threads in wait,
> release semaphore 2, waits on waiters_done_
> both threads wake, decrement waiters_, get 0 for w,
>        <logic error here>
> one calls set waiters_done_,
> broadcast thread comes out of waiters_done_,
> other thread calls waiters_done_, (which leaves waiters_done_ in the
> signaled state)
>        <sets the trap>
> broadcast thread returns releases mutex, other threads get
> mutex and also return,
> next barrier, first two threads enter wait, one goes to broadcast, release
> semaphore 2, skips waiters_done_ as it had been released last time
> returns, processes, enters the barrier for the next barrier operation
> and waits,
> three threads are now in wait, two have the previous barrier phase,
> one the current phase, there's one count left in the semaphore which a
> thread gets, returns, enters the barrier as a waiter, sleeps, and the
> deadlock is completed
>
> --
> David Fries <[email protected]>
> http://fries.net/~david/ (PGP encryption key available)
>
> _______________________________________________
> osg-submissions mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
>
>
_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org

Reply via email to