[PATCH 2/8] mfplat: Close event handle on async result release.

Nikolay Sivov nsivov at codeweavers.com
Mon Mar 11 05:28:04 CDT 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mfplat/queue.c        |  2 ++
 dlls/mfplat/tests/mfplat.c | 67 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 69 insertions(+)

diff --git a/dlls/mfplat/queue.c b/dlls/mfplat/queue.c
index 408526fec0..66f8588f82 100644
--- a/dlls/mfplat/queue.c
+++ b/dlls/mfplat/queue.c
@@ -649,6 +649,8 @@ static ULONG WINAPI async_result_Release(IMFAsyncResult *iface)
             IUnknown_Release(result->object);
         if (result->state)
             IUnknown_Release(result->state);
+        if (result->result.hEvent)
+            CloseHandle(result->result.hEvent);
         heap_free(result);
 
         MFUnlockPlatform();
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 1bf7ebb41e..278112a9c5 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -907,7 +907,10 @@ static void test_MFCreateAsyncResult(void)
     IUnknown *state, *object;
     MFASYNCRESULT *data;
     ULONG refcount;
+    HANDLE event;
+    DWORD flags;
     HRESULT hr;
+    BOOL ret;
 
     init_test_callback(&callback);
 
@@ -994,6 +997,35 @@ static void test_MFCreateAsyncResult(void)
     ok(!refcount, "Unexpected refcount %u\n.", refcount);
     refcount = IMFAsyncResult_Release(result);
     ok(!refcount, "Unexpected refcount %u\n.", refcount);
+
+    /* Event handle is closed on release. */
+    hr = MFCreateAsyncResult(NULL, NULL, NULL, &result);
+    ok(hr == S_OK, "Failed to create object, hr %#x.\n", hr);
+
+    data = (MFASYNCRESULT *)result;
+    data->hEvent = event = CreateEventA(NULL, FALSE, FALSE, NULL);
+    ok(data->hEvent != NULL, "Failed to create event.\n");
+    ret = GetHandleInformation(event, &flags);
+    ok(ret, "Failed to get handle info.\n");
+
+    refcount = IMFAsyncResult_Release(result);
+    ok(!refcount, "Unexpected refcount %u\n.", refcount);
+    ret = GetHandleInformation(event, &flags);
+    ok(!ret, "Expected handle to be closed.\n");
+
+    hr = MFCreateAsyncResult(NULL, &callback.IMFAsyncCallback_iface, NULL, &result);
+    ok(hr == S_OK, "Failed to create object, hr %#x.\n", hr);
+
+    data = (MFASYNCRESULT *)result;
+    data->hEvent = event = CreateEventA(NULL, FALSE, FALSE, NULL);
+    ok(data->hEvent != NULL, "Failed to create event.\n");
+    ret = GetHandleInformation(event, &flags);
+    ok(ret, "Failed to get handle info.\n");
+
+    refcount = IMFAsyncResult_Release(result);
+    ok(!refcount, "Unexpected refcount %u\n.", refcount);
+    ret = GetHandleInformation(event, &flags);
+    ok(!ret, "Expected handle to be closed.\n");
 }
 
 static void test_startup(void)
@@ -1696,6 +1728,40 @@ static void test_system_time_source(void)
     IMFPresentationTimeSource_Release(time_source);
 }
 
+static void test_MFInvokeCallback(void)
+{
+    struct test_callback callback;
+    IMFAsyncResult *result;
+    MFASYNCRESULT *data;
+    ULONG refcount;
+    HRESULT hr;
+    DWORD ret;
+
+    hr = MFStartup(MF_VERSION, MFSTARTUP_FULL);
+    ok(hr == S_OK, "Failed to start up, hr %#x.\n", hr);
+
+    init_test_callback(&callback);
+
+    hr = MFCreateAsyncResult(NULL, &callback.IMFAsyncCallback_iface, NULL, &result);
+    ok(hr == S_OK, "Failed to create object, hr %#x.\n", hr);
+
+    data = (MFASYNCRESULT *)result;
+    data->hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
+    ok(data->hEvent != NULL, "Failed to create event.\n");
+
+    hr = MFInvokeCallback(result);
+    ok(hr == S_OK, "Failed to invoke, hr %#x.\n", hr);
+
+    ret = WaitForSingleObject(data->hEvent, 100);
+    ok(ret == WAIT_TIMEOUT, "Expected timeout, ret %#x.\n", ret);
+
+    refcount = IMFAsyncResult_Release(result);
+    ok(!refcount, "Unexpected refcount %u\n.", refcount);
+
+    hr = MFShutdown();
+    ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
+}
+
 START_TEST(mfplat)
 {
     CoInitialize(NULL);
@@ -1723,6 +1789,7 @@ START_TEST(mfplat)
     test_event_queue();
     test_presentation_descriptor();
     test_system_time_source();
+    test_MFInvokeCallback();
 
     CoUninitialize();
 }
-- 
2.20.1




More information about the wine-devel mailing list