Module: wine Branch: master Commit: 0aea30e44cad38e63d541df1ef2478dd6534f388 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0aea30e44cad38e63d541df1ef...
Author: Aric Stewart aric@codeweavers.com Date: Tue Mar 17 11:35:47 2015 -0500
dsound: Do not wait on mixer thread exit on dsound release.
This fixes a loader deadlock if the dsound object is being released during a dll unload.
---
dlls/dsound/dsound.c | 4 +++- dlls/dsound/dsound_private.h | 1 + dlls/dsound/mixer.c | 1 + 3 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/dlls/dsound/dsound.c b/dlls/dsound/dsound.c index 824f581..065c377 100644 --- a/dlls/dsound/dsound.c +++ b/dlls/dsound/dsound.c @@ -208,8 +208,9 @@ static ULONG DirectSoundDevice_Release(DirectSoundDevice * device)
SetEvent(device->sleepev); if (device->thread) { - WaitForSingleObject(device->thread, INFINITE); + WaitForSingleObject(device->thread_finished, INFINITE); CloseHandle(device->thread); + CloseHandle(device->thread_finished); } CloseHandle(device->sleepev);
@@ -384,6 +385,7 @@ static HRESULT DirectSoundDevice_Initialize(DirectSoundDevice ** ppDevice, LPCGU
hr = DSOUND_PrimaryCreate(device); if (hr == DS_OK) { + device->thread_finished = CreateEventW(0, 0, 0, 0); device->thread = CreateThread(0, 0, DSOUND_mixthread, device, 0, 0); SetThreadPriority(device->thread, THREAD_PRIORITY_TIME_CRITICAL); } else diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h index 9c58679..9c001ed 100644 --- a/dlls/dsound/dsound_private.h +++ b/dlls/dsound/dsound_private.h @@ -108,6 +108,7 @@ struct DirectSoundDevice IAudioRenderClient *render;
HANDLE sleepev, thread; + HANDLE thread_finished; struct list entry; };
diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c index 8dbd15a..85ab14a 100644 --- a/dlls/dsound/mixer.c +++ b/dlls/dsound/mixer.c @@ -909,5 +909,6 @@ DWORD CALLBACK DSOUND_mixthread(void *p) DSOUND_PerformMix(dev); RtlReleaseResource(&(dev->buffer_list_lock)); } + SetEvent(dev->thread_finished); return 0; }