Michael Stefaniuc : dplayx: Simplify ref-counting for IDPLobbySP.

Alexandre Julliard julliard at winehq.org
Wed Sep 4 15:08:30 CDT 2013


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

Author: Michael Stefaniuc <mstefani at redhat.de>
Date:   Tue Sep  3 23:20:21 2013 +0200

dplayx: Simplify ref-counting for IDPLobbySP.

---

 dlls/dplayx/lobbysp.c |   71 +++++++++++++-----------------------------------
 1 files changed, 19 insertions(+), 52 deletions(-)

diff --git a/dlls/dplayx/lobbysp.c b/dlls/dplayx/lobbysp.c
index 33101fd..4dd7eb2 100644
--- a/dlls/dplayx/lobbysp.c
+++ b/dlls/dplayx/lobbysp.c
@@ -38,7 +38,6 @@ typedef struct IDPLobbySPImpl IDPLobbySPImpl;
 
 typedef struct tagDPLobbySPIUnknownData
 {
-  LONG              ulObjRef;
   CRITICAL_SECTION  DPLSP_lock;
 } DPLobbySPIUnknownData;
 
@@ -48,13 +47,13 @@ typedef struct tagDPLobbySPData
 } DPLobbySPData;
 
 #define DPLSP_IMPL_FIELDS \
-   LONG ulInterfaceRef; \
    DPLobbySPIUnknownData* unk; \
    DPLobbySPData* sp;
 
 struct IDPLobbySPImpl
 {
   const IDPLobbySPVtbl *lpVtbl;
+  LONG ref;
   DPLSP_IMPL_FIELDS
 };
 
@@ -165,79 +164,47 @@ static BOOL DPLSP_DestroyDPLobbySP( LPVOID lpSP )
 }
 
 static HRESULT WINAPI IDPLobbySPImpl_QueryInterface( IDPLobbySP *iface, REFIID riid,
-        void **ppvObj )
+        void **ppv )
 {
-  IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface;
-  TRACE("(%p)->(%s,%p)\n", This, debugstr_guid( riid ), ppvObj );
+  TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid( riid ), ppv );
 
-  *ppvObj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
-                       sizeof( *This ) );
-
-  if( *ppvObj == NULL )
-  {
-    return DPERR_OUTOFMEMORY;
-  }
-
-  CopyMemory( *ppvObj, This, sizeof( *This )  );
-  (*(IDPLobbySPImpl**)ppvObj)->ulInterfaceRef = 0;
-
-  if( IsEqualGUID( &IID_IDPLobbySP, riid ) )
-  {
-    IDPLobbySPImpl *This = *ppvObj;
-    This->lpVtbl = &dpLobbySPVT;
-  }
-  else
+  if ( IsEqualGUID( &IID_IUnknown, riid ) || IsEqualGUID( &IID_IDPLobbySP, riid ) )
   {
-    /* Unsupported interface */
-    HeapFree( GetProcessHeap(), 0, *ppvObj );
-    *ppvObj = NULL;
-
-    return E_NOINTERFACE;
+    *ppv = iface;
+    IDPLobbySP_AddRef(iface);
+    return S_OK;
   }
 
-  IDPLobbySP_AddRef( (LPDPLOBBYSP)*ppvObj );
-
-  return S_OK;
+  FIXME("Unsupported interface %s\n", debugstr_guid(riid));
+  *ppv = NULL;
+  return E_NOINTERFACE;
 }
 
 static ULONG WINAPI IDPLobbySPImpl_AddRef( IDPLobbySP *iface )
 {
   IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
-  ULONG ulInterfaceRefCount, ulObjRefCount;
-
-  ulObjRefCount       = InterlockedIncrement( &This->unk->ulObjRef );
-  ulInterfaceRefCount = InterlockedIncrement( &This->ulInterfaceRef );
+  ULONG ref = InterlockedIncrement( &This->ref );
 
-  TRACE( "ref count incremented to %u:%u for %p\n",
-         ulInterfaceRefCount, ulObjRefCount, This );
+  TRACE( "(%p) ref=%d\n", This, ref );
 
-  return ulObjRefCount;
+  return ref;
 }
 
 static ULONG WINAPI IDPLobbySPImpl_Release( IDPLobbySP *iface )
 {
   IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
-  ULONG ulInterfaceRefCount, ulObjRefCount;
-
-  ulObjRefCount       = InterlockedDecrement( &This->unk->ulObjRef );
-  ulInterfaceRefCount = InterlockedDecrement( &This->ulInterfaceRef );
+  ULONG ref = InterlockedDecrement( &This->ref );
 
-  TRACE( "ref count decremented to %u:%u for %p\n",
-         ulInterfaceRefCount, ulObjRefCount, This );
-
-  /* Deallocate if this is the last reference to the object */
-  if( ulObjRefCount == 0 )
-  {
-     DPLSP_DestroyDPLobbySP( This );
-     DPLSP_DestroyIUnknown( This );
-  }
+  TRACE( "(%p) ref=%d\n", This, ref );
 
-  if( ulInterfaceRefCount == 0 )
+  if( !ref )
   {
+    DPLSP_DestroyDPLobbySP( This );
+    DPLSP_DestroyIUnknown( This );
     HeapFree( GetProcessHeap(), 0, This );
   }
 
-  return ulInterfaceRefCount;
+  return ref;
 }
 
 static HRESULT WINAPI IDPLobbySPImpl_AddGroupToGroup( IDPLobbySP *iface,




More information about the wine-cvs mailing list