[PATCH 2/4] mfplat: Fix EndCreateObject*() when events are used.
Nikolay Sivov
nsivov at codeweavers.com
Fri Mar 29 06:46:52 CDT 2019
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/mfplat/main.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index c6cf4717ec..4444e49d81 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -4259,6 +4259,7 @@ struct resolver_queued_result
IUnknown *object;
MF_OBJECT_TYPE obj_type;
HRESULT hr;
+ IMFAsyncResult *inner_result;
enum resolved_object_origin origin;
};
@@ -4313,7 +4314,7 @@ static HRESULT resolver_handler_end_create(struct source_resolver *resolver, enu
IMFSchemeHandler *scheme_handler;
} handler;
- queued_result = heap_alloc(sizeof(*queued_result));
+ queued_result = heap_alloc_zero(sizeof(*queued_result));
IMFAsyncResult_GetObject(inner_result, &handler.handler);
@@ -4337,6 +4338,12 @@ static HRESULT resolver_handler_end_create(struct source_resolver *resolver, enu
{
MFASYNCRESULT *data = (MFASYNCRESULT *)inner_result;
+ if (data->hEvent)
+ {
+ queued_result->inner_result = inner_result;
+ IMFAsyncResult_AddRef(queued_result->inner_result);
+ }
+
/* Push resolved object type and created object, so we don't have to guess on End*() call. */
EnterCriticalSection(&resolver->cs);
list_add_tail(&resolver->pending, &queued_result->entry);
@@ -4687,7 +4694,7 @@ static HRESULT resolver_end_create_object(struct source_resolver *resolver, enum
LIST_FOR_EACH_ENTRY(iter, &resolver->pending, struct resolver_queued_result, entry)
{
- if (iter->object == object && iter->origin == origin)
+ if (iter->inner_result == result || (iter->object == object && iter->origin == origin))
{
list_remove(&iter->entry);
queued_result = iter;
@@ -4704,6 +4711,8 @@ static HRESULT resolver_end_create_object(struct source_resolver *resolver, enum
*out = queued_result->object;
*obj_type = queued_result->obj_type;
hr = queued_result->hr;
+ if (queued_result->inner_result)
+ IMFAsyncResult_Release(queued_result->inner_result);
heap_free(queued_result);
}
else
--
2.20.1
More information about the wine-devel
mailing list