From 487c691dc5f481e00f567f468c599b8fd2e4fea7 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Wed, 23 Aug 2006 16:36:43 +0100 Subject: [PATCH] rpcrt4: Tests for CStdStubBuffer_Disconnect and a tidy up of the implementation. --- dlls/rpcrt4/cstub.c | 15 ++++++++------- dlls/rpcrt4/tests/cstub.c | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/dlls/rpcrt4/cstub.c b/dlls/rpcrt4/cstub.c index 17890e3c230..ac8c31b84ee 100644 --- a/dlls/rpcrt4/cstub.c +++ b/dlls/rpcrt4/cstub.c @@ -149,13 +149,14 @@ HRESULT WINAPI CStdStubBuffer_Connect(LPRPCSTUBBUFFER iface, void WINAPI CStdStubBuffer_Disconnect(LPRPCSTUBBUFFER iface) { - CStdStubBuffer *This = (CStdStubBuffer *)iface; - TRACE("(%p)->Disconnect()\n",This); - if (This->pvServerObject) - { - IUnknown_Release(This->pvServerObject); - This->pvServerObject = NULL; - } + CStdStubBuffer *This = (CStdStubBuffer *)iface; + IUnknown *old; + TRACE("(%p)->Disconnect()\n",This); + + old = InterlockedExchangePointer((void**)&This->pvServerObject, NULL); + + if(old) + IUnknown_Release(old); } HRESULT WINAPI CStdStubBuffer_Invoke(LPRPCSTUBBUFFER iface, diff --git a/dlls/rpcrt4/tests/cstub.c b/dlls/rpcrt4/tests/cstub.c index 8df8365db1f..53261fdca32 100644 --- a/dlls/rpcrt4/tests/cstub.c +++ b/dlls/rpcrt4/tests/cstub.c @@ -703,6 +703,19 @@ static void test_Connect(IPSFactoryBuffer *ppsf) ok(connect_test_orig_release_called == 2, "release called %d\n", connect_test_orig_release_called); } +static void test_Disconnect(IPSFactoryBuffer *ppsf) +{ + IUnknownVtbl *orig_vtbl = &connect_test_orig_vtbl; + IUnknown *obj = (IUnknown*)&orig_vtbl; + IRpcStubBuffer *pstub = create_stub(ppsf, &IID_if1, obj, S_OK); + CStdStubBuffer *cstd_stub = (CStdStubBuffer*)pstub; + + connect_test_orig_release_called = 0; + IRpcStubBuffer_Disconnect(pstub); + ok(connect_test_orig_release_called == 1, "release called %d\n", connect_test_orig_release_called); + ok(cstd_stub->pvServerObject == NULL, "pvServerObject %p\n", cstd_stub->pvServerObject); +} + START_TEST( cstub ) { IPSFactoryBuffer *ppsf; @@ -713,6 +726,7 @@ START_TEST( cstub ) test_NdrStubForwardingFunction(); test_CreateStub(ppsf); test_Connect(ppsf); + test_Disconnect(ppsf); OleUninitialize(); }