From: Nikolay Sivov <nsivov(a)codeweavers.com> Current logic is broken and does not allow releasing a factory, and creating another one. There is no reason at the moment not to have multiple factory instances. Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- dlls/dxcore/dxcore.c | 25 ++++++++++++------------- dlls/dxcore/tests/dxcore.c | 4 ++-- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/dlls/dxcore/dxcore.c b/dlls/dxcore/dxcore.c index 9aa28f8a3a0..9095430aafd 100644 --- a/dlls/dxcore/dxcore.c +++ b/dlls/dxcore/dxcore.c @@ -506,25 +506,24 @@ static const struct IDXCoreAdapterFactoryVtbl dxcore_adapter_factory_vtbl = HRESULT STDMETHODCALLTYPE DXCoreCreateAdapterFactory(REFIID riid, void **out) { - static struct dxcore_adapter_factory *factory = NULL; + struct dxcore_adapter_factory *factory; + HRESULT hr; TRACE("riid %s, out %p\n", debugstr_guid(riid), out); if (!out) return E_POINTER; - if (!factory) - { - if (!(factory = calloc(1, sizeof(*factory)))) - { - *out = NULL; - return E_OUTOFMEMORY; - } + *out = NULL; - factory->IDXCoreAdapterFactory_iface.lpVtbl = &dxcore_adapter_factory_vtbl; - factory->refcount = 0; - } + if (!(factory = calloc(1, sizeof(*factory)))) + return E_OUTOFMEMORY; + + factory->IDXCoreAdapterFactory_iface.lpVtbl = &dxcore_adapter_factory_vtbl; + factory->refcount = 1; - TRACE("created IDXCoreAdapterFactory %p.\n", *out); - return IDXCoreAdapterFactory_QueryInterface(&factory->IDXCoreAdapterFactory_iface, riid, out); + hr = IDXCoreAdapterFactory_QueryInterface(&factory->IDXCoreAdapterFactory_iface, riid, out); + IDXCoreAdapterFactory_Release(&factory->IDXCoreAdapterFactory_iface); + + return hr; } diff --git a/dlls/dxcore/tests/dxcore.c b/dlls/dxcore/tests/dxcore.c index 1748307e730..5da7dc9972d 100644 --- a/dlls/dxcore/tests/dxcore.c +++ b/dlls/dxcore/tests/dxcore.c @@ -79,9 +79,9 @@ static void test_DXCoreCreateAdapterFactory(void) hr = pDXCoreCreateAdapterFactory(&IID_IDXCoreAdapterFactory, (void **)&factory2); ok(hr == S_OK, "got hr %#lx.\n", hr); + todo_wine ok(factory == factory2, "got factory %p, factory2 %p.\n", factory, factory2); - refcount = IDXCoreAdapterFactory_Release(factory2); - ok(refcount == 1, "got refcount %ld.\n", refcount); + IDXCoreAdapterFactory_Release(factory2); check_interface(factory, &IID_IAgileObject, FALSE); check_interface(factory, &IID_IDXCoreAdapter, FALSE); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8634