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