Ken Thomases : winecoreaudio: Replace pthread mutex with OSSpinLock.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Dec 21 10:36:35 CST 2006
Module: wine
Branch: master
Commit: 5cbc520318980cdeb22b39d7da81f6bc6b87ec12
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5cbc520318980cdeb22b39d7da81f6bc6b87ec12
Author: Ken Thomases <ken at codeweavers.com>
Date: Thu Dec 21 03:50:18 2006 -0600
winecoreaudio: Replace pthread mutex with OSSpinLock.
---
dlls/winmm/winecoreaudio/audio.c | 72 +++++++++++++++++---------------------
1 files changed, 32 insertions(+), 40 deletions(-)
diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c
index e5b9e41..d7dc314 100644
--- a/dlls/winmm/winecoreaudio/audio.c
+++ b/dlls/winmm/winecoreaudio/audio.c
@@ -32,9 +32,6 @@
# include <unistd.h>
#endif
#include <fcntl.h>
-#ifdef HAVE_PTHREAD_H
-# include <pthread.h>
-#endif
#include "windef.h"
#include "winbase.h"
@@ -55,6 +52,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wave);
#if defined(HAVE_COREAUDIO_COREAUDIO_H) && defined(HAVE_AUDIOUNIT_AUDIOUNIT_H)
#include <CoreAudio/CoreAudio.h>
#include <CoreFoundation/CoreFoundation.h>
+#include <libkern/OSAtomic.h>
/*
Due to AudioUnit headers conflict define some needed types.
@@ -152,7 +150,7 @@ typedef struct {
DWORD tickCountMS; /* time in MS of last AudioUnit callback */
- pthread_mutex_t lock; /* synchronization stuff */
+ OSSpinLock lock; /* synchronization stuff */
BOOL trace_on;
BOOL warn_on;
@@ -177,7 +175,7 @@ typedef struct {
char interface_name[32];*/
/* synchronization stuff */
- pthread_mutex_t lock;
+ OSSpinLock lock;
} WINE_WAVEIN;
static WINE_WAVEOUT WOutDev [MAX_WAVEOUTDRV];
@@ -505,7 +503,7 @@ LONG CoreAudio_WaveInit(void)
WOutDev[i].caps.dwFormats |= WAVE_FORMAT_1M16;
WOutDev[i].caps.dwFormats |= WAVE_FORMAT_1S16;
- pthread_mutex_init(&WOutDev[i].lock, NULL); /* initialize the mutex */
+ WOutDev[i].lock = 0; /* initialize the mutex */
}
/* create mach messages handler */
@@ -554,18 +552,11 @@ LONG CoreAudio_WaveInit(void)
void CoreAudio_WaveRelease(void)
{
/* Stop CFRunLoop in messageThread */
- int i;
-
TRACE("()\n");
CFMessagePortSendRequest(Port_SendToMessageThread, kStopLoopMessage, NULL, 0.0, 0.0, NULL, NULL);
CFRelease(Port_SendToMessageThread);
Port_SendToMessageThread = NULL;
-
- for (i = 0; i < MAX_WAVEOUTDRV; ++i)
- {
- pthread_mutex_destroy(&WOutDev[i].lock);
- }
}
/*======================================================================*
@@ -661,18 +652,19 @@ static DWORD wodOpen(WORD wDevID, LPWAVE
}
wwo = &WOutDev[wDevID];
- pthread_mutex_lock(&wwo->lock);
+ if (!OSSpinLockTry(&wwo->lock))
+ return MMSYSERR_ALLOCATED;
if (wwo->state != WINE_WS_CLOSED)
{
- pthread_mutex_unlock(&wwo->lock);
+ OSSpinLockUnlock(&wwo->lock);
return MMSYSERR_ALLOCATED;
}
if (!AudioUnit_CreateDefaultAudioUnit((void *) wwo, &wwo->audioUnit))
{
ERR("CoreAudio_CreateDefaultAudioUnit(%p) failed\n", wwo);
- pthread_mutex_unlock(&wwo->lock);
+ OSSpinLockUnlock(&wwo->lock);
return MMSYSERR_ERROR;
}
@@ -701,7 +693,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVE
if (!ret)
{
AudioUnit_CloseAudioUnit(wwo->audioUnit);
- pthread_mutex_unlock(&wwo->lock);
+ OSSpinLockUnlock(&wwo->lock);
return WAVERR_BADFORMAT; /* FIXME return an error based on the OSStatus */
}
wwo->streamDescription = streamFormat;
@@ -712,7 +704,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVE
ERR("AudioOutputUnitStart failed: %08x\n", ret);
AudioUnitUninitialize(wwo->audioUnit);
AudioUnit_CloseAudioUnit(wwo->audioUnit);
- pthread_mutex_unlock(&wwo->lock);
+ OSSpinLockUnlock(&wwo->lock);
return MMSYSERR_ERROR; /* FIXME return an error based on the OSStatus */
}
@@ -738,7 +730,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVE
wwo->warn_on = WARN_ON(wave);
wwo->err_on = ERR_ON(wave);
- pthread_mutex_unlock(&wwo->lock);
+ OSSpinLockUnlock(&wwo->lock);
retval = wodNotifyClient(wwo, WOM_OPEN, 0L, 0L);
@@ -762,11 +754,11 @@ static DWORD wodClose(WORD wDevID)
}
wwo = &WOutDev[wDevID];
- pthread_mutex_lock(&wwo->lock);
+ OSSpinLockLock(&wwo->lock);
if (wwo->lpQueuePtr)
{
WARN("buffers still playing !\n");
- pthread_mutex_unlock(&wwo->lock);
+ OSSpinLockUnlock(&wwo->lock);
ret = WAVERR_STILLPLAYING;
} else
{
@@ -776,7 +768,7 @@ static DWORD wodClose(WORD wDevID)
wwo->state = WINE_WS_CLOSED; /* mark the device as closed */
- pthread_mutex_unlock(&wwo->lock);
+ OSSpinLockUnlock(&wwo->lock);
err = AudioUnitUninitialize(wwo->audioUnit);
if (err) {
@@ -920,7 +912,7 @@ static void wodHelper_NotifyCompletions(
LPWAVEHDR lpWaveHdr;
LPWAVEHDR lpFirstDoneWaveHdr = NULL;
- pthread_mutex_lock(&wwo->lock);
+ OSSpinLockLock(&wwo->lock);
/* First, excise all of the done headers from the queue into
* a free-standing list. */
@@ -957,8 +949,8 @@ static void wodHelper_NotifyCompletions(
lpLastDoneWaveHdr->lpNext = NULL;
}
}
-
- pthread_mutex_unlock(&wwo->lock);
+
+ OSSpinLockUnlock(&wwo->lock);
/* Now, send the "done" notification for each header in our list. */
for (lpWaveHdr = lpFirstDoneWaveHdr; lpWaveHdr; lpWaveHdr = lpWaveHdr->lpNext)
@@ -1007,7 +999,7 @@ static DWORD wodWrite(WORD wDevID, LPWAV
lpWaveHdr->dwFlags |= WHDR_INQUEUE;
lpWaveHdr->lpNext = 0;
- pthread_mutex_lock(&wwo->lock);
+ OSSpinLockLock(&wwo->lock);
/* insert buffer at the end of queue */
for (wh = &(wwo->lpQueuePtr); *wh; wh = &((*wh)->lpNext))
/* Do nothing */;
@@ -1024,8 +1016,8 @@ static DWORD wodWrite(WORD wDevID, LPWAV
wwo->dwPartialOffset = 0;
}
- pthread_mutex_unlock(&wwo->lock);
-
+ OSSpinLockUnlock(&wwo->lock);
+
return MMSYSERR_NOERROR;
}
@@ -1058,10 +1050,10 @@ static DWORD wodPause(WORD wDevID)
(char) (status >> 24), (char) (status >> 16), (char) (status >> 8), (char) status);
}
- pthread_mutex_lock(&WOutDev[wDevID].lock);
+ OSSpinLockLock(&WOutDev[wDevID].lock);
if (WOutDev[wDevID].state == WINE_WS_PLAYING || WOutDev[wDevID].state == WINE_WS_STOPPED)
WOutDev[wDevID].state = WINE_WS_PAUSED;
- pthread_mutex_unlock(&WOutDev[wDevID].lock);
+ OSSpinLockUnlock(&WOutDev[wDevID].lock);
return MMSYSERR_NOERROR;
}
@@ -1089,7 +1081,7 @@ static DWORD wodRestart(WORD wDevID)
* Although we can be in PAUSED state with the Audio Unit still running,
* that's harmless because the render callback will just produce silence.
*/
- pthread_mutex_lock(&WOutDev[wDevID].lock);
+ OSSpinLockLock(&WOutDev[wDevID].lock);
if (WOutDev[wDevID].state == WINE_WS_PAUSED)
{
if (WOutDev[wDevID].lpPlayPtr)
@@ -1097,7 +1089,7 @@ static DWORD wodRestart(WORD wDevID)
else
WOutDev[wDevID].state = WINE_WS_STOPPED;
}
- pthread_mutex_unlock(&WOutDev[wDevID].lock);
+ OSSpinLockUnlock(&WOutDev[wDevID].lock);
status = AudioOutputUnitStart(WOutDev[wDevID].audioUnit);
if (status) {
@@ -1132,16 +1124,16 @@ static DWORD wodReset(WORD wDevID)
/* updates current notify list */
/* if resetting, remove all wave headers and notify client that all headers were completed */
wodHelper_NotifyCompletions(wwo, TRUE);
-
- pthread_mutex_lock(&wwo->lock);
-
+
+ OSSpinLockLock(&wwo->lock);
+
wwo->lpPlayPtr = wwo->lpQueuePtr = wwo->lpLoopPtr = NULL;
wwo->state = WINE_WS_STOPPED;
wwo->dwPlayedTotal = wwo->dwWrittenTotal = 0;
wwo->dwPartialOffset = 0; /* Clear partial wavehdr */
- pthread_mutex_unlock(&wwo->lock);
+ OSSpinLockUnlock(&wwo->lock);
status = AudioOutputUnitStart(wwo->audioUnit);
@@ -1175,9 +1167,9 @@ static DWORD wodGetPosition(WORD wDevID,
wwo = &WOutDev[wDevID];
- pthread_mutex_lock(&WOutDev[wDevID].lock);
+ OSSpinLockLock(&WOutDev[wDevID].lock);
val = wwo->dwPlayedTotal;
- pthread_mutex_unlock(&WOutDev[wDevID].lock);
+ OSSpinLockUnlock(&WOutDev[wDevID].lock);
return bytes_to_mmtime(lpTime, val, &wwo->format);
}
@@ -1363,7 +1355,7 @@ OSStatus CoreAudio_woAudioUnitIOProc(voi
unsigned int dataNeeded = ioData->mBuffers[0].mDataByteSize;
unsigned int dataProvided = 0;
- pthread_mutex_lock(&wwo->lock);
+ OSSpinLockLock(&wwo->lock);
while (dataNeeded > 0 && wwo->state == WINE_WS_PLAYING && wwo->lpPlayPtr)
{
@@ -1393,7 +1385,7 @@ OSStatus CoreAudio_woAudioUnitIOProc(voi
}
}
- pthread_mutex_unlock(&wwo->lock);
+ OSSpinLockUnlock(&wwo->lock);
/* We can't provide any more wave data. Fill the rest with silence. */
if (dataNeeded > 0)
More information about the wine-cvs
mailing list