Maarten Lankhorst schrieb:
After trying to implement the alsa mixer I came across a problem: If winmm is unloading, a deadlock could occur if during unloading it's waiting for another thread.
In winmm itself this isn't much of a problem: there aren't any threads.
However, the drivers used by winmm may have threads, and if the application doesn't shut down their drivers properly, it could be possible that a deadlock occurs when the drivers unload because winmm unloads.
For that reason I propose to add a flag that's passed to the sound drivers that signals a shutdown in DLL_DETACH context, so that drivers can choose to call TerminateThread instead of waiting tidily for the thread to finish running.
It's not pretty, but I don't see another way how to make sure that deadlocks won't occur when unloading winmm. I'm open for other suggestions though.
AFAIK you get the DRVM_EXIT message only when winmm is unloading. Alternatively you could do it in response to the DRV_CLOSE message which winmm sends just before it tries to unload the driver.
That said I don't see how your code in ALSA_MixerExit() could deadlock. It effectively tries to exit the thread the same way as MIX_Close, doesn't it? So the thread should exit safely. Imo the question is rather why the thread isn't exiting and you are waiting forever. Forcibly calling TerminateThread just covers the problem.