Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
From David Fries, "Here is a fix for a deadlock seen under Windows us…
…ing 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" Merged from svn/trunk using: svn merge -r 10456:10457 http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/OpenThreads/win32
- Loading branch information