Alexandre Julliard : rpcrt4: Use interlocked functions to increment/ decrement ref counts.

Alexandre Julliard julliard at winehq.org
Mon Jul 7 09:19:12 CDT 2008


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jul  7 12:09:45 2008 +0200

rpcrt4: Use interlocked functions to increment/decrement ref counts.

---

 dlls/rpcrt4/cpsf.c    |    6 +++---
 dlls/rpcrt4/ndr_ole.c |   11 ++++++-----
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/dlls/rpcrt4/cpsf.c b/dlls/rpcrt4/cpsf.c
index 23c4aeb..373c97a 100644
--- a/dlls/rpcrt4/cpsf.c
+++ b/dlls/rpcrt4/cpsf.c
@@ -65,7 +65,7 @@ static HRESULT WINAPI CStdPSFactory_QueryInterface(LPPSFACTORYBUFFER iface,
   if (IsEqualGUID(&IID_IUnknown,riid) ||
       IsEqualGUID(&IID_IPSFactoryBuffer,riid)) {
     *obj = This;
-    This->RefCount++;
+    InterlockedIncrement( &This->RefCount );
     return S_OK;
   }
   return E_NOINTERFACE;
@@ -75,14 +75,14 @@ static ULONG WINAPI CStdPSFactory_AddRef(LPPSFACTORYBUFFER iface)
 {
   CStdPSFactoryBuffer *This = (CStdPSFactoryBuffer *)iface;
   TRACE("(%p)->AddRef()\n",iface);
-  return ++(This->RefCount);
+  return InterlockedIncrement( &This->RefCount );
 }
 
 static ULONG WINAPI CStdPSFactory_Release(LPPSFACTORYBUFFER iface)
 {
   CStdPSFactoryBuffer *This = (CStdPSFactoryBuffer *)iface;
   TRACE("(%p)->Release()\n",iface);
-  return --(This->RefCount);
+  return InterlockedDecrement( &This->RefCount );
 }
 
 static HRESULT WINAPI CStdPSFactory_CreateProxy(LPPSFACTORYBUFFER iface,
diff --git a/dlls/rpcrt4/ndr_ole.c b/dlls/rpcrt4/ndr_ole.c
index edfc78c..9bfab95 100644
--- a/dlls/rpcrt4/ndr_ole.c
+++ b/dlls/rpcrt4/ndr_ole.c
@@ -79,7 +79,7 @@ static HMODULE LoadCOM(void)
 typedef struct RpcStreamImpl
 {
   const IStreamVtbl *lpVtbl;
-  DWORD RefCount;
+  LONG RefCount;
   PMIDL_STUB_MESSAGE pMsg;
   LPDWORD size;
   unsigned char *data;
@@ -95,7 +95,7 @@ static HRESULT WINAPI RpcStream_QueryInterface(LPSTREAM iface,
       IsEqualGUID(&IID_ISequentialStream, riid) ||
       IsEqualGUID(&IID_IStream, riid)) {
     *obj = This;
-    This->RefCount++;
+    InterlockedIncrement( &This->RefCount );
     return S_OK;
   }
   return E_NOINTERFACE;
@@ -104,19 +104,20 @@ static HRESULT WINAPI RpcStream_QueryInterface(LPSTREAM iface,
 static ULONG WINAPI RpcStream_AddRef(LPSTREAM iface)
 {
   RpcStreamImpl *This = (RpcStreamImpl *)iface;
-  return ++(This->RefCount);
+  return InterlockedIncrement( &This->RefCount );
 }
 
 static ULONG WINAPI RpcStream_Release(LPSTREAM iface)
 {
   RpcStreamImpl *This = (RpcStreamImpl *)iface;
-  if (!--(This->RefCount)) {
+  ULONG ref = InterlockedDecrement( &This->RefCount );
+  if (!ref) {
     TRACE("size=%d\n", *This->size);
     This->pMsg->Buffer = This->data + *This->size;
     HeapFree(GetProcessHeap(),0,This);
     return 0;
   }
-  return This->RefCount;
+  return ref;
 }
 
 static HRESULT WINAPI RpcStream_Read(LPSTREAM iface,




More information about the wine-cvs mailing list