Possible critical section bug - lock by invalid thread
Alex Villacís Lasso
a_villacis at palosanto.com
Mon Aug 29 14:07:21 CDT 2005
In several RPG I have been testing, I have found deadlocks on the sound
thread - the sound loops on and on, and the program freezes. At the same
time, I see messages like the following:
fixme:ddraw:Main_DirectDraw_SetCooperativeLevel
(0x7fe32708)->(00010022,00000008)
err:dsound:DSOUND_MixOne underrun on sound buffer 0x7fe82310
err:dsound:DSOUND_MixOne underrun on sound buffer 0x7fe82880
err:wave:DSDB_MMAPCopy mmap partially failed.
err:ntdll:RtlpWaitForCriticalSection section 0x7fe3336c "?" wait timed
out in thread 000a, blocked by 0000, retrying (60 sec)
err:ntdll:RtlpWaitForCriticalSection section 0x7fe3336c "?" wait timed
out in thread 0009, blocked by 0000, retrying (60 sec)
err:ntdll:RtlpWaitForCriticalSection section 0x7fe3336c "?" wait timed
out in thread 000a, blocked by 0000, retrying (60 sec)
err:ntdll:RtlpWaitForCriticalSection section 0x7fe3336c "?" wait timed
out in thread 0009, blocked by 0000, retrying (60 sec)
I thought that DirectSound was not performing locking properly, until I
noticed the following: all the times I see this deadlock, the thread ID
"responsible" for the deadlock is 0000. From a little digging in the
code, I see that 0 is the value used in the critical section when it is
not held by any thread. So these are potentially cases where a previous
thread frees the critical section, but somehow the critical section
remains locked. I think I saw a select() call in the wineserver, used as
an implementation for this wait, and this select() call times out,
resulting in the behavior shown above.
All these instances happen under heavy CPU load, so I suspect some sort
of race condition. If I really try and bog down the CPU, I can even
trigger this deadlock on the DirectSound tests (under ALSA).
Could anybody who knows about Wine critical sections comment on this? I
do not really understand the implementation of critical sections at the
wineserver side (other than the fact that a select() is used somewhere),
so I could take a long time to unravel this bug. This problem does not
seem specific to DirectSound as far as I could tell, so this might be
affecting a couple other apps under Wine. Also, comments on how I could
supply more information on this are welcome.
Alex Villacís Lasso
More information about the wine-devel
mailing list