dxdiagn: Avoid caching a single instance of the root container.

This commit is contained in:
Andrew Nguyen 2011-02-01 04:32:34 -06:00 committed by Alexandre Julliard
parent c99e0fbc0e
commit 1fe904bd08
3 changed files with 19 additions and 10 deletions

View File

@ -48,7 +48,6 @@ struct IDxDiagProviderImpl {
/* IDxDiagProvider fields */
BOOL init;
DXDIAG_INIT_PARAMS params;
IDxDiagContainer* pRootContainer;
};
/* ---------------- */

View File

@ -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 =

View File

@ -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);
}