Module: wine Branch: master Commit: 351165e30dd5afc67a9fa53cdd5aac9b07a1a910 URL: http://source.winehq.org/git/wine.git/?a=commit;h=351165e30dd5afc67a9fa53cdd...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Fri Dec 10 16:06:56 2010 +0100
quartz: Fix a race condition in videorenderer endflush.
---
dlls/quartz/videorenderer.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c index 6f2a860..86b9f2a 100644 --- a/dlls/quartz/videorenderer.c +++ b/dlls/quartz/videorenderer.c @@ -432,6 +432,7 @@ static HRESULT WINAPI VideoRenderer_Receive(BaseInputPin* pin, IMediaSample * pS LeaveCriticalSection(&This->filter.csFilter); WaitForSingleObject(This->blocked, INFINITE); EnterCriticalSection(&This->filter.csFilter); + SetEvent(This->hEvent); This->sample_held = NULL; if (This->filter.state == State_Paused) { @@ -959,6 +960,15 @@ static HRESULT WINAPI VideoRenderer_InputPin_EndFlush(IPin * iface) TRACE("(%p/%p)->()\n", This, iface);
EnterCriticalSection(This->pin.pCritSec); + + if (pVideoRenderer->sample_held) { + SetEvent(pVideoRenderer->blocked); + ResetEvent(pVideoRenderer->hEvent); + LeaveCriticalSection(This->pin.pCritSec); + WaitForSingleObject(pVideoRenderer->hEvent, INFINITE); + EnterCriticalSection(This->pin.pCritSec); + ResetEvent(pVideoRenderer->blocked); + } if (pVideoRenderer->filter.state == State_Paused) { ResetEvent(pVideoRenderer->blocked); ResetEvent(pVideoRenderer->hEvent);