From: Nikolay Sivov nsivov@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@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);