comsvcs: Create MTA without initialization thread.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49679
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2020-10-19 12:43:04 +03:00 committed by Alexandre Julliard
parent 2a7a1bbee2
commit c9cc098ccd
1 changed files with 5 additions and 21 deletions

View File

@ -40,7 +40,7 @@ typedef struct dispensermanager
{ {
IDispenserManager IDispenserManager_iface; IDispenserManager IDispenserManager_iface;
LONG ref; LONG ref;
HANDLE mta_thread, mta_stop_event; CO_MTA_USAGE_COOKIE mta_cookie;
} dispensermanager; } dispensermanager;
typedef struct holder typedef struct holder
@ -285,27 +285,14 @@ static ULONG WINAPI dismanager_Release(IDispenserManager *iface)
if (!ref) if (!ref)
{ {
if (This->mta_thread) if (This->mta_cookie)
{ CoDecrementMTAUsage(This->mta_cookie);
SetEvent(This->mta_stop_event);
WaitForSingleObject(This->mta_thread, INFINITE);
CloseHandle(This->mta_stop_event);
CloseHandle(This->mta_thread);
}
heap_free(This); heap_free(This);
} }
return ref; 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, static HRESULT WINAPI dismanager_RegisterDispenser(IDispenserManager *iface, IDispenserDriver *driver,
LPCOLESTR name, IHolder **dispenser) LPCOLESTR name, IHolder **dispenser)
{ {
@ -319,11 +306,8 @@ static HRESULT WINAPI dismanager_RegisterDispenser(IDispenserManager *iface, IDi
hr = create_holder(driver, dispenser); hr = create_holder(driver, dispenser);
if (!This->mta_thread) if (!This->mta_cookie)
{ CoIncrementMTAUsage(&This->mta_cookie);
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); TRACE("<-- 0x%08x, %p\n", hr, *dispenser);