Huw Davies : rpcrt4: Tests for CStdStubBuffer_Disconnect and a tidy up of the implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Aug 23 16:36:26 CDT 2006


Module: wine
Branch: master
Commit: 487c691dc5f481e00f567f468c599b8fd2e4fea7
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=487c691dc5f481e00f567f468c599b8fd2e4fea7

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed Aug 23 16:36:43 2006 +0100

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 17890e3..ac8c31b 100644
--- a/dlls/rpcrt4/cstub.c
+++ b/dlls/rpcrt4/cstub.c
@@ -149,13 +149,14 @@ HRESULT WINAPI CStdStubBuffer_Connect(LP
 
 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 8df8365..53261fd 100644
--- a/dlls/rpcrt4/tests/cstub.c
+++ b/dlls/rpcrt4/tests/cstub.c
@@ -703,6 +703,19 @@ static void test_Connect(IPSFactoryBuffe
     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();
 }




More information about the wine-cvs mailing list