mfplat: Avoid a race condition when releasing a tracked sample.

Right now, if the same tracked sample is released at the same time
from two different threads it might happen that neither of them calls
the callback, because they might go through the critical section at
the same time (while neither has decremented the reference count yet).

Signed-off-by: Giovanni Mascellani <gmascellani@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Giovanni Mascellani 2022-05-03 15:06:43 +02:00 committed by Alexandre Julliard
parent 0c35a851cd
commit b180775121
1 changed files with 2 additions and 4 deletions

View File

@ -182,11 +182,11 @@ static ULONG WINAPI sample_Release(IMFSample *iface)
static ULONG WINAPI sample_tracked_Release(IMFSample *iface)
{
struct sample *sample = impl_from_IMFSample(iface);
ULONG refcount;
ULONG refcount = InterlockedDecrement(&sample->attributes.ref);
HRESULT hr;
EnterCriticalSection(&sample->attributes.cs);
if (sample->tracked_result && sample->tracked_refcount == (sample->attributes.ref - 1))
if (sample->tracked_result && sample->tracked_refcount == refcount)
{
IRtwqAsyncResult *tracked_result = sample->tracked_result;
sample->tracked_result = NULL;
@ -199,8 +199,6 @@ static ULONG WINAPI sample_tracked_Release(IMFSample *iface)
}
LeaveCriticalSection(&sample->attributes.cs);
refcount = InterlockedDecrement(&sample->attributes.ref);
TRACE("%p, refcount %lu.\n", iface, refcount);
if (!refcount)