quartz: Have thread safety in memallocator.

This commit is contained in:
Maarten Lankhorst 2008-06-15 17:52:09 -07:00 committed by Alexandre Julliard
parent dae09d000c
commit 3d43a629d0
1 changed files with 14 additions and 7 deletions

View File

@ -257,7 +257,8 @@ static HRESULT WINAPI BaseMemAllocator_Decommit(IMemAllocator * iface)
}
else
{
assert(This->lWaiting == 0);
if (This->lWaiting != 0)
ERR("Waiting: %d\n", This->lWaiting);
This->bCommitted = FALSE;
CloseHandle(This->hSemWaiting);
@ -286,19 +287,24 @@ static HRESULT WINAPI BaseMemAllocator_GetBuffer(IMemAllocator * iface, IMediaSa
*pSample = NULL;
if (!This->bCommitted)
return VFW_E_NOT_COMMITTED;
EnterCriticalSection(This->pCritSect);
if (!This->bCommitted || This->bDecommitQueued)
hr = VFW_E_NOT_COMMITTED;
else
++This->lWaiting;
LeaveCriticalSection(This->pCritSect);
if (FAILED(hr))
return hr;
This->lWaiting++;
if (WaitForSingleObject(This->hSemWaiting, (dwFlags & AM_GBF_NOWAIT) ? 0 : INFINITE) != WAIT_OBJECT_0)
{
This->lWaiting--;
InterlockedDecrement(&This->lWaiting);
return VFW_E_TIMEOUT;
}
This->lWaiting--;
EnterCriticalSection(This->pCritSect);
{
--This->lWaiting;
if (!This->bCommitted)
hr = VFW_E_NOT_COMMITTED;
else if (This->bDecommitQueued)
@ -347,7 +353,8 @@ static HRESULT WINAPI BaseMemAllocator_ReleaseBuffer(IMemAllocator * iface, IMed
{
HRESULT hrfree;
assert(This->lWaiting == 0);
if (This->lWaiting != 0)
ERR("Waiting: %d\n", This->lWaiting);
This->bCommitted = FALSE;
This->bDecommitQueued = FALSE;