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