evr/sample: Avoid a race condition when releasing a tracked sample.
Same asb180775121
. Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org> (cherry picked from commitce71f5a05f
) Signed-off-by: Michael Stefaniuc <mstefani@winehq.org>
This commit is contained in:
parent
967b3294fa
commit
7d74dd91bf
1 changed files with 7 additions and 5 deletions
|
@ -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 %u.\n", iface, refcount);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue