Zebediah Figura : comsvcs: Create an implicit MTA thread in RegisterDispenser().
Alexandre Julliard
julliard at winehq.org
Wed May 15 14:32:20 CDT 2019
Module: wine
Branch: stable
Commit: e822720a1db28f204c10a74d027bbbc4eaa89f6d
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e822720a1db28f204c10a74d027bbbc4eaa89f6d
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Thu Feb 7 12:21:34 2019 -0600
comsvcs: Create an implicit MTA thread in RegisterDispenser().
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46581
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit ac1bb4536473eb705d5fa828406fa4eb473b9f41)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
---
dlls/comsvcs/main.c | 27 ++++++++++++++++++++++++---
dlls/comsvcs/tests/dispenser.c | 1 -
2 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/dlls/comsvcs/main.c b/dlls/comsvcs/main.c
index d7831cf..af9487b 100644
--- a/dlls/comsvcs/main.c
+++ b/dlls/comsvcs/main.c
@@ -40,7 +40,7 @@ typedef struct dispensermanager
{
IDispenserManager IDispenserManager_iface;
LONG ref;
-
+ HANDLE mta_thread, mta_stop_event;
} dispensermanager;
typedef struct holder
@@ -264,12 +264,27 @@ static ULONG WINAPI dismanager_Release(IDispenserManager *iface)
if (!ref)
{
- heap_free(This);
+ if (This->mta_thread)
+ {
+ SetEvent(This->mta_stop_event);
+ WaitForSingleObject(This->mta_thread, INFINITE);
+ CloseHandle(This->mta_stop_event);
+ CloseHandle(This->mta_thread);
+ }
+ heap_free(This);
}
return ref;
}
+static DWORD WINAPI mta_thread_proc(void *arg)
+{
+ CoInitializeEx(NULL, COINIT_MULTITHREADED);
+ WaitForSingleObject(arg, INFINITE);
+ CoUninitialize();
+ return 0;
+}
+
static HRESULT WINAPI dismanager_RegisterDispenser(IDispenserManager *iface, IDispenserDriver *driver,
LPCOLESTR name, IHolder **dispenser)
{
@@ -283,6 +298,12 @@ static HRESULT WINAPI dismanager_RegisterDispenser(IDispenserManager *iface, IDi
hr = create_holder(driver, dispenser);
+ if (!This->mta_thread)
+ {
+ This->mta_stop_event = CreateEventA(NULL, TRUE, FALSE, NULL);
+ This->mta_thread = CreateThread(NULL, 0, mta_thread_proc, This->mta_stop_event, 0, NULL);
+ }
+
TRACE("<-- 0x%08x, %p\n", hr, *dispenser);
return hr;
@@ -313,7 +334,7 @@ static HRESULT WINAPI comsvcscf_CreateInstance(IClassFactory *cf,IUnknown* outer
TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), object);
- dismanager = heap_alloc(sizeof(*dismanager));
+ dismanager = heap_alloc_zero(sizeof(*dismanager));
if (!dismanager)
{
*object = NULL;
diff --git a/dlls/comsvcs/tests/dispenser.c b/dlls/comsvcs/tests/dispenser.c
index 6fae802..7af38d0 100644
--- a/dlls/comsvcs/tests/dispenser.c
+++ b/dlls/comsvcs/tests/dispenser.c
@@ -188,7 +188,6 @@ static void create_dispenser(void)
thread = CreateThread(NULL, 0, com_thread, NULL, 0, NULL);
ok(!WaitForSingleObject(thread, 1000), "wait failed\n");
GetExitCodeThread(thread, &ret);
-todo_wine
ok(ret == S_OK, "got unexpected hr %#x\n", ret);
hr = IDispenserManager_RegisterDispenser(dispenser, &DispenserDriver, pool0, &holder2);
More information about the wine-cvs
mailing list