winecoreaudio: Fix race condition in drvclose.

This commit is contained in:
Nick Burns 2007-01-01 02:22:58 -08:00 committed by Alexandre Julliard
parent 656fc93815
commit 7aab8810e1
1 changed files with 15 additions and 2 deletions

View File

@ -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;
} }
/*======================================================================* /*======================================================================*