winecoreaudio: Fix race condition in drvclose.
This commit is contained in:
parent
656fc93815
commit
7aab8810e1
|
@ -207,6 +207,7 @@ typedef struct {
|
||||||
static WINE_WAVEOUT WOutDev [MAX_WAVEOUTDRV];
|
static WINE_WAVEOUT WOutDev [MAX_WAVEOUTDRV];
|
||||||
static WINE_WAVEIN WInDev [MAX_WAVEINDRV];
|
static WINE_WAVEIN WInDev [MAX_WAVEINDRV];
|
||||||
|
|
||||||
|
static HANDLE hThread = NULL; /* Track the thread we create so we can clean it up later */
|
||||||
static CFMessagePortRef Port_SendToMessageThread;
|
static CFMessagePortRef Port_SendToMessageThread;
|
||||||
|
|
||||||
static void wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo);
|
static void wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo);
|
||||||
|
@ -499,7 +500,6 @@ LONG CoreAudio_WaveInit(void)
|
||||||
UInt32 propertySize;
|
UInt32 propertySize;
|
||||||
CHAR szPname[MAXPNAMELEN];
|
CHAR szPname[MAXPNAMELEN];
|
||||||
int i;
|
int i;
|
||||||
HANDLE hThread;
|
|
||||||
CFStringRef messageThreadPortName;
|
CFStringRef messageThreadPortName;
|
||||||
CFMessagePortRef port_ReceiveInMessageThread;
|
CFMessagePortRef port_ReceiveInMessageThread;
|
||||||
int inputSampleRate;
|
int inputSampleRate;
|
||||||
|
@ -665,6 +665,13 @@ LONG CoreAudio_WaveInit(void)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Cannot WAIT for any events because we are called from the loader (which has a lock on loading stuff) */
|
||||||
|
/* We might want to wait for this thread to be created -- but we cannot -- not here at least */
|
||||||
|
/* Instead track the thread so we can clean it up later */
|
||||||
|
if ( hThread )
|
||||||
|
{
|
||||||
|
ERR("Message thread already started -- expect problems\n");
|
||||||
|
}
|
||||||
hThread = CreateThread(NULL, 0, messageThread, (LPVOID)port_ReceiveInMessageThread, 0, NULL);
|
hThread = CreateThread(NULL, 0, messageThread, (LPVOID)port_ReceiveInMessageThread, 0, NULL);
|
||||||
if ( !hThread )
|
if ( !hThread )
|
||||||
{
|
{
|
||||||
|
@ -688,6 +695,12 @@ void CoreAudio_WaveRelease(void)
|
||||||
CFMessagePortSendRequest(Port_SendToMessageThread, kStopLoopMessage, NULL, 0.0, 0.0, NULL, NULL);
|
CFMessagePortSendRequest(Port_SendToMessageThread, kStopLoopMessage, NULL, 0.0, 0.0, NULL, NULL);
|
||||||
CFRelease(Port_SendToMessageThread);
|
CFRelease(Port_SendToMessageThread);
|
||||||
Port_SendToMessageThread = NULL;
|
Port_SendToMessageThread = NULL;
|
||||||
|
|
||||||
|
/* Wait for the thread to finish and clean it up */
|
||||||
|
/* This rids us of any quick start/shutdown driver crashes */
|
||||||
|
WaitForSingleObject(hThread, INFINITE);
|
||||||
|
CloseHandle(hThread);
|
||||||
|
hThread = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*======================================================================*
|
/*======================================================================*
|
||||||
|
|
Loading…
Reference in New Issue