Commit 3d43a629 authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Alexandre Julliard

quartz: Have thread safety in memallocator.

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