Commit 13087008 authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

dsound: Use an SRW lock for buffer_list_lock.

parent 729c9eab
......@@ -643,7 +643,7 @@ static HRESULT WINAPI IDirectSoundBufferImpl_Unlock(IDirectSoundBuffer8 *iface,
if (x1 || x2)
{
RtlAcquireResourceShared(&This->device->buffer_list_lock, TRUE);
AcquireSRWLockShared(&This->device->buffer_list_lock);
LIST_FOR_EACH_ENTRY(iter, &This->buffer->buffers, IDirectSoundBufferImpl, entry )
{
RtlAcquireResourceShared(&iter->lock, TRUE);
......@@ -664,7 +664,7 @@ static HRESULT WINAPI IDirectSoundBufferImpl_Unlock(IDirectSoundBuffer8 *iface,
}
RtlReleaseResource(&iter->lock);
}
RtlReleaseResource(&This->device->buffer_list_lock);
ReleaseSRWLockShared(&This->device->buffer_list_lock);
}
return hres;
......
......@@ -181,7 +181,7 @@ static HRESULT DirectSoundDevice_Create(DirectSoundDevice ** ppDevice)
InitializeCriticalSection(&(device->mixlock));
device->mixlock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": DirectSoundDevice.mixlock");
RtlInitializeResource(&(device->buffer_list_lock));
InitializeSRWLock(&device->buffer_list_lock);
*ppDevice = device;
......@@ -238,7 +238,6 @@ static ULONG DirectSoundDevice_Release(DirectSoundDevice * device)
HeapFree(GetProcessHeap(), 0, device->tmp_buffer);
HeapFree(GetProcessHeap(), 0, device->cp_buffer);
HeapFree(GetProcessHeap(), 0, device->buffer);
RtlDeleteResource(&device->buffer_list_lock);
device->mixlock.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&device->mixlock);
HeapFree(GetProcessHeap(),0,device);
......@@ -612,7 +611,7 @@ HRESULT DirectSoundDevice_AddBuffer(
TRACE("(%p, %p)\n", device, pDSB);
RtlAcquireResourceExclusive(&(device->buffer_list_lock), TRUE);
AcquireSRWLockExclusive(&device->buffer_list_lock);
if (device->buffers)
newbuffers = HeapReAlloc(GetProcessHeap(),0,device->buffers,sizeof(IDirectSoundBufferImpl*)*(device->nrofbuffers+1));
......@@ -629,7 +628,7 @@ HRESULT DirectSoundDevice_AddBuffer(
hr = DSERR_OUTOFMEMORY;
}
RtlReleaseResource(&(device->buffer_list_lock));
ReleaseSRWLockExclusive(&device->buffer_list_lock);
return hr;
}
......@@ -644,7 +643,7 @@ void DirectSoundDevice_RemoveBuffer(DirectSoundDevice * device, IDirectSoundBuff
TRACE("(%p, %p)\n", device, pDSB);
RtlAcquireResourceExclusive(&(device->buffer_list_lock), TRUE);
AcquireSRWLockExclusive(&device->buffer_list_lock);
if (device->nrofbuffers == 1) {
assert(device->buffers[0] == pDSB);
......@@ -662,7 +661,7 @@ void DirectSoundDevice_RemoveBuffer(DirectSoundDevice * device, IDirectSoundBuff
device->nrofbuffers--;
TRACE("buffer count is now %d\n", device->nrofbuffers);
RtlReleaseResource(&(device->buffer_list_lock));
ReleaseSRWLockExclusive(&device->buffer_list_lock);
}
/*******************************************************************************
......@@ -869,14 +868,14 @@ static HRESULT WINAPI IDirectSound8Impl_SetCooperativeLevel(IDirectSound8 *iface
level==DSSCL_PRIORITY ? "DSSCL_PRIORITY" : "DSSCL_EXCLUSIVE");
}
RtlAcquireResourceExclusive(&device->buffer_list_lock, TRUE);
AcquireSRWLockExclusive(&device->buffer_list_lock);
EnterCriticalSection(&device->mixlock);
if ((level == DSSCL_WRITEPRIMARY) != (device->priolevel == DSSCL_WRITEPRIMARY))
hr = DSOUND_ReopenDevice(device, level == DSSCL_WRITEPRIMARY);
if (SUCCEEDED(hr))
device->priolevel = level;
LeaveCriticalSection(&device->mixlock);
RtlReleaseResource(&device->buffer_list_lock);
ReleaseSRWLockExclusive(&device->buffer_list_lock);
return hr;
}
......
......@@ -80,7 +80,7 @@ struct DirectSoundDevice
DWORD writelead, buflen, ac_frames, frag_frames, playpos, pad, stopped;
int nrofbuffers;
IDirectSoundBufferImpl** buffers;
RTL_RWLOCK buffer_list_lock;
SRWLOCK buffer_list_lock;
CRITICAL_SECTION mixlock;
IDirectSoundBufferImpl *primary;
DWORD speaker_config;
......
......@@ -767,9 +767,9 @@ DWORD CALLBACK DSOUND_mixthread(void *p)
if (!dev->ref)
break;
RtlAcquireResourceShared(&(dev->buffer_list_lock), TRUE);
AcquireSRWLockShared(&dev->buffer_list_lock);
DSOUND_PerformMix(dev);
RtlReleaseResource(&(dev->buffer_list_lock));
ReleaseSRWLockShared(&dev->buffer_list_lock);
}
return 0;
}
......@@ -472,7 +472,7 @@ HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX passe
}
/* **** */
RtlAcquireResourceExclusive(&(device->buffer_list_lock), TRUE);
AcquireSRWLockExclusive(&device->buffer_list_lock);
EnterCriticalSection(&(device->mixlock));
if (device->priolevel == DSSCL_WRITEPRIMARY) {
......@@ -508,7 +508,7 @@ HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX passe
out:
LeaveCriticalSection(&(device->mixlock));
RtlReleaseResource(&(device->buffer_list_lock));
ReleaseSRWLockExclusive(&device->buffer_list_lock);
/* **** */
return err;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment