[PATCH 1/2] evr/sample: Avoid a race condition when releasing a tracked sample.
Nikolay Sivov
nsivov at codeweavers.com
Tue May 10 11:16:17 CDT 2022
Same as b1807751219e256867eaac5cc4d8b97a5482978f.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/evr/sample.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/dlls/evr/sample.c b/dlls/evr/sample.c
index 1d29b6cdc2c..738f803fe66 100644
--- a/dlls/evr/sample.c
+++ b/dlls/evr/sample.c
@@ -920,19 +920,21 @@ static ULONG WINAPI video_sample_AddRef(IMFSample *iface)
static ULONG WINAPI video_sample_Release(IMFSample *iface)
{
struct video_sample *sample = impl_from_IMFSample(iface);
- ULONG refcount;
+ ULONG refcount = InterlockedDecrement(&sample->refcount);
+ IMFAsyncResult *tracked_result = NULL;
IMFSample_LockStore(sample->sample);
- if (sample->tracked_result && sample->tracked_refcount == (sample->refcount - 1))
+ if (sample->tracked_result && sample->tracked_refcount == refcount)
{
- video_sample_tracking_thread_invoke(sample->tracked_result);
- IMFAsyncResult_Release(sample->tracked_result);
+ tracked_result = sample->tracked_result;
+ video_sample_tracking_thread_invoke(tracked_result);
sample->tracked_result = NULL;
sample->tracked_refcount = 0;
}
IMFSample_UnlockStore(sample->sample);
- refcount = InterlockedDecrement(&sample->refcount);
+ if (tracked_result)
+ IMFAsyncResult_Release(tracked_result);
TRACE("%p, refcount %lu.\n", iface, refcount);
--
2.35.1
More information about the wine-devel
mailing list