Maarten Lankhorst schrieb:
> Peter Beutner schreef:
>> But this only works if DSOUND_Stop and DSOUND_Release are called from
>> different threads, right?
> It is during shutdown, DSOUND has an internal timer/thread called the
> mixer, it calls DSOUND_Stop because we signalled it to stop playbacking,
> then the program calls idirectsoundbuffer_release which calls
> DSOUND_Release. Since DSOUND_release also unsets hwbuf, the timer would
> then continue to use an uninitialized waveout interface, which could
> result in something even uglier.
>> Isn't the real problem that when ALSA_DestroyRingMessage(*) is called from
>> IDsDriverBuffer_Release it doesn't check if there are still any "fast
>> messages"
>> in the queue which wait for their message to be handled?
>> Just from a quick look it seems you could theoretically trigger the
>> same deadlock with the WODM_RESET & WODM_CLOSE messages when using
>> the waveout system.
> I agree it's horribly complex, I hope to improve that in alsa during
> summer. 
That's great ;)

> However when calling IDsDriverbuffer_Release dsound says it no
> longer has anything that uses that interface. Because
> IDsDriverBuffer_Stop hasn't returned yet this is in fact untrue: it is
> still using idsdriverbuffer, so to make sure it isn't, dsound has to
> hold the mixer lock so it waits until the mixer is done playing around.
> 
> You are _NOT_ allowed to call Release on a interface if you still have
> something that uses the interface. The bug is definitely in dsound, it
> just resulted in winealsa being unresponsive.
ok that makes sense. Definitely something wrong in dsound.

But I still think that ALSA_DestroyRingMessage should signal any message left
in the queue. Imo it just calls for trouble to expect that messages always
are added in the right order.


Reply via email to