[PATCH 2/4] mfplat: Handle tracked sample release condition separately from refcount update.
Nikolay Sivov
nsivov at codeweavers.com
Mon Feb 15 05:33:29 CST 2021
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/mfplat/sample.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/dlls/mfplat/sample.c b/dlls/mfplat/sample.c
index 10d2b7bc2a8..82e7c8680dd 100644
--- a/dlls/mfplat/sample.c
+++ b/dlls/mfplat/sample.c
@@ -184,18 +184,21 @@ static ULONG WINAPI sample_tracked_Release(IMFSample *iface)
HRESULT hr;
EnterCriticalSection(&sample->attributes.cs);
- refcount = InterlockedDecrement(&sample->attributes.ref);
- if (sample->tracked_result && sample->tracked_refcount == refcount)
+ if (sample->tracked_result && sample->tracked_refcount == (sample->attributes.ref - 1))
{
- /* Call could fail if queue system is not initialized, it's not critical. */
- if (FAILED(hr = RtwqInvokeCallback(sample->tracked_result)))
- WARN("Failed to invoke tracking callback, hr %#x.\n", hr);
- IRtwqAsyncResult_Release(sample->tracked_result);
+ IRtwqAsyncResult *tracked_result = sample->tracked_result;
sample->tracked_result = NULL;
sample->tracked_refcount = 0;
+
+ /* Call could fail if queue system is not initialized, it's not critical. */
+ if (FAILED(hr = RtwqInvokeCallback(tracked_result)))
+ WARN("Failed to invoke tracking callback, hr %#x.\n", hr);
+ IRtwqAsyncResult_Release(tracked_result);
}
LeaveCriticalSection(&sample->attributes.cs);
+ refcount = InterlockedDecrement(&sample->attributes.ref);
+
TRACE("%p, refcount %u.\n", iface, refcount);
if (!refcount)
--
2.30.0
More information about the wine-devel
mailing list