Maarten Lankhorst : quartz: Have thread safety in memallocator.
Alexandre Julliard
julliard at winehq.org
Tue Jun 24 06:44:08 CDT 2008
Module: wine
Branch: master
Commit: 3d43a629d05967af6fc9fd056f995b2a563f4f14
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3d43a629d05967af6fc9fd056f995b2a563f4f14
Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Sun Jun 15 17:52:09 2008 -0700
quartz: Have thread safety in memallocator.
---
dlls/quartz/memallocator.c | 21 ++++++++++++++-------
1 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/dlls/quartz/memallocator.c b/dlls/quartz/memallocator.c
index d4539aa..7969193 100644
--- a/dlls/quartz/memallocator.c
+++ b/dlls/quartz/memallocator.c
@@ -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;
More information about the wine-cvs
mailing list