Andrew Nguyen : dxdiagn: Avoid caching a single instance of the root container.
Alexandre Julliard
julliard at winehq.org
Tue Feb 1 12:24:59 CST 2011
Module: wine
Branch: master
Commit: 1fe904bd08b26b0f0548b77f9b1d7ef3c00a5509
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1fe904bd08b26b0f0548b77f9b1d7ef3c00a5509
Author: Andrew Nguyen <anguyen at codeweavers.com>
Date: Tue Feb 1 04:32:34 2011 -0600
dxdiagn: Avoid caching a single instance of the root container.
---
dlls/dxdiagn/dxdiag_private.h | 1 -
dlls/dxdiagn/provider.c | 19 +++++++++++--------
dlls/dxdiagn/tests/provider.c | 9 ++++++++-
3 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/dlls/dxdiagn/dxdiag_private.h b/dlls/dxdiagn/dxdiag_private.h
index 58de882..ba48c14 100644
--- a/dlls/dxdiagn/dxdiag_private.h
+++ b/dlls/dxdiagn/dxdiag_private.h
@@ -48,7 +48,6 @@ struct IDxDiagProviderImpl {
/* IDxDiagProvider fields */
BOOL init;
DXDIAG_INIT_PARAMS params;
- IDxDiagContainer* pRootContainer;
};
/* ---------------- */
diff --git a/dlls/dxdiagn/provider.c b/dlls/dxdiagn/provider.c
index 428c7ef..0734241 100644
--- a/dlls/dxdiagn/provider.c
+++ b/dlls/dxdiagn/provider.c
@@ -107,21 +107,24 @@ static HRESULT WINAPI IDxDiagProviderImpl_Initialize(PDXDIAGPROVIDER iface, DXDI
}
static HRESULT WINAPI IDxDiagProviderImpl_GetRootContainer(PDXDIAGPROVIDER iface, IDxDiagContainer** ppInstance) {
- HRESULT hr = S_OK;
+ HRESULT hr;
IDxDiagProviderImpl *This = (IDxDiagProviderImpl *)iface;
+ IDxDiagContainer *root;
+
TRACE("(%p,%p)\n", iface, ppInstance);
if (FALSE == This->init) {
return CO_E_NOTINITIALIZED;
}
- if (NULL == This->pRootContainer) {
- hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &This->pRootContainer);
- if (FAILED(hr)) {
- return hr;
- }
- hr = DXDiag_InitRootDXDiagContainer(This->pRootContainer);
+
+ hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void **)&root);
+ if (FAILED(hr)) {
+ return hr;
}
- return IDxDiagContainerImpl_QueryInterface((PDXDIAGCONTAINER)This->pRootContainer, &IID_IDxDiagContainer, (void**) ppInstance);
+
+ DXDiag_InitRootDXDiagContainer(root);
+
+ return IDxDiagContainerImpl_QueryInterface(root, &IID_IDxDiagContainer, (void **)ppInstance);
}
static const IDxDiagProviderVtbl DxDiagProvider_Vtbl =
diff --git a/dlls/dxdiagn/tests/provider.c b/dlls/dxdiagn/tests/provider.c
index 0aa228b..69006f0 100644
--- a/dlls/dxdiagn/tests/provider.c
+++ b/dlls/dxdiagn/tests/provider.c
@@ -94,7 +94,7 @@ static void test_GetRootContainer(void)
{
HRESULT hr;
IDxDiagProvider *pddp;
- IDxDiagContainer *pddc;
+ IDxDiagContainer *pddc, *pddc2;
DXDIAG_INIT_PARAMS params;
hr = CoCreateInstance(&CLSID_DxDiagProvider, NULL, CLSCTX_INPROC_SERVER,
@@ -140,6 +140,13 @@ static void test_GetRootContainer(void)
hr = IDxDiagProvider_GetRootContainer(pddp, &pddc);
ok(hr == S_OK, "Expected IDxDiagProvider::GetRootContainer to return S_OK, got %x\n", hr);
+ /* IDxDiagProvider::GetRootContainer creates new instances of the root
+ * container rather than maintain a static root container. */
+ hr = IDxDiagProvider_GetRootContainer(pddp, &pddc2);
+ ok(hr == S_OK, "Expected IDxDiagProvider::GetRootContainer to return S_OK, got %x\n", hr);
+ ok(pddc != pddc2, "Expected the two pointers (%p vs. %p) to be unequal\n", pddc, pddc2);
+
+ IDxDiagContainer_Release(pddc2);
IDxDiagContainer_Release(pddc);
IDxDiagProvider_Release(pddp);
}
More information about the wine-cvs
mailing list