[Bug 46208] Elite Dangerous is unstable in wine-devel

wine-bugs at winehq.org wine-bugs at winehq.org
Thu Nov 29 10:12:39 CST 2018


https://bugs.winehq.org/show_bug.cgi?id=46208

--- Comment #5 from Zebediah Figura <z.figura12 at gmail.com> ---
I think I see the bug, or at least a bug. We can run into the following race
(simplified slightly):

wake-all    waiter 1    waiter 2
----------------------------------------
        timeout
val 2 -> 0
        val 0 -> 0
ReleaseKeyed
                wakeup
                WaitForKeyed
ReleaseKeyed
                wakeup
        WaitForKeyed
                (WaitForKeyed)
(WaitForKeyed)
----------------------------------------

If this is what's going on here, waiter 1 (i.e. in this case 0037) gets stuck
forever waiting for a Release() that doesn't happen.

Our implementation of ReleaseKeyedEvent() relies on the fact that the first N
waiters on the queue are the N waiters on the event. Normally this is true.
Even when one waiter times out and subsequently requeues itself (n.b. the
requeue is so that a release doesn't block trying to wake someone who isn't
waiting), it'll normally requeue itself as the Nth waiter on the event. The
problem arises when the second waiter thread calls RtlSleepConditionVariable()
again, before RtlWakeAllConditionVariable() is done executing; then that waiter
gets woken up twice, and the first waiter not at all; and more importantly the
first waiter ends up waiting forever, which probably wasn't intended.

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list