Commit b11dddf7 authored by Michael Stefaniuc's avatar Michael Stefaniuc Committed by Alexandre Julliard

dplayx: Simplify ref-counting for IDPLobbySP.

parent 5da060be
...@@ -38,7 +38,6 @@ typedef struct IDPLobbySPImpl IDPLobbySPImpl; ...@@ -38,7 +38,6 @@ typedef struct IDPLobbySPImpl IDPLobbySPImpl;
typedef struct tagDPLobbySPIUnknownData typedef struct tagDPLobbySPIUnknownData
{ {
LONG ulObjRef;
CRITICAL_SECTION DPLSP_lock; CRITICAL_SECTION DPLSP_lock;
} DPLobbySPIUnknownData; } DPLobbySPIUnknownData;
...@@ -48,13 +47,13 @@ typedef struct tagDPLobbySPData ...@@ -48,13 +47,13 @@ typedef struct tagDPLobbySPData
} DPLobbySPData; } DPLobbySPData;
#define DPLSP_IMPL_FIELDS \ #define DPLSP_IMPL_FIELDS \
LONG ulInterfaceRef; \
DPLobbySPIUnknownData* unk; \ DPLobbySPIUnknownData* unk; \
DPLobbySPData* sp; DPLobbySPData* sp;
struct IDPLobbySPImpl struct IDPLobbySPImpl
{ {
const IDPLobbySPVtbl *lpVtbl; const IDPLobbySPVtbl *lpVtbl;
LONG ref;
DPLSP_IMPL_FIELDS DPLSP_IMPL_FIELDS
}; };
...@@ -165,79 +164,47 @@ static BOOL DPLSP_DestroyDPLobbySP( LPVOID lpSP ) ...@@ -165,79 +164,47 @@ static BOOL DPLSP_DestroyDPLobbySP( LPVOID lpSP )
} }
static HRESULT WINAPI IDPLobbySPImpl_QueryInterface( IDPLobbySP *iface, REFIID riid, static HRESULT WINAPI IDPLobbySPImpl_QueryInterface( IDPLobbySP *iface, REFIID riid,
void **ppvObj ) void **ppv )
{ {
IDPLobbySPImpl *This = (IDPLobbySPImpl *)iface; TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid( riid ), ppv );
TRACE("(%p)->(%s,%p)\n", This, debugstr_guid( riid ), ppvObj );
*ppvObj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, if ( IsEqualGUID( &IID_IUnknown, riid ) || IsEqualGUID( &IID_IDPLobbySP, riid ) )
sizeof( *This ) );
if( *ppvObj == NULL )
{ {
return DPERR_OUTOFMEMORY; *ppv = iface;
IDPLobbySP_AddRef(iface);
return S_OK;
} }
CopyMemory( *ppvObj, This, sizeof( *This ) ); FIXME("Unsupported interface %s\n", debugstr_guid(riid));
(*(IDPLobbySPImpl**)ppvObj)->ulInterfaceRef = 0; *ppv = NULL;
if( IsEqualGUID( &IID_IDPLobbySP, riid ) )
{
IDPLobbySPImpl *This = *ppvObj;
This->lpVtbl = &dpLobbySPVT;
}
else
{
/* Unsupported interface */
HeapFree( GetProcessHeap(), 0, *ppvObj );
*ppvObj = NULL;
return E_NOINTERFACE; return E_NOINTERFACE;
}
IDPLobbySP_AddRef( (LPDPLOBBYSP)*ppvObj );
return S_OK;
} }
static ULONG WINAPI IDPLobbySPImpl_AddRef( IDPLobbySP *iface ) static ULONG WINAPI IDPLobbySPImpl_AddRef( IDPLobbySP *iface )
{ {
IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface ); IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
ULONG ulInterfaceRefCount, ulObjRefCount; ULONG ref = InterlockedIncrement( &This->ref );
ulObjRefCount = InterlockedIncrement( &This->unk->ulObjRef );
ulInterfaceRefCount = InterlockedIncrement( &This->ulInterfaceRef );
TRACE( "ref count incremented to %u:%u for %p\n", TRACE( "(%p) ref=%d\n", This, ref );
ulInterfaceRefCount, ulObjRefCount, This );
return ulObjRefCount; return ref;
} }
static ULONG WINAPI IDPLobbySPImpl_Release( IDPLobbySP *iface ) static ULONG WINAPI IDPLobbySPImpl_Release( IDPLobbySP *iface )
{ {
IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface ); IDPLobbySPImpl *This = impl_from_IDPLobbySP( iface );
ULONG ulInterfaceRefCount, ulObjRefCount; ULONG ref = InterlockedDecrement( &This->ref );
ulObjRefCount = InterlockedDecrement( &This->unk->ulObjRef );
ulInterfaceRefCount = InterlockedDecrement( &This->ulInterfaceRef );
TRACE( "ref count decremented to %u:%u for %p\n", TRACE( "(%p) ref=%d\n", This, ref );
ulInterfaceRefCount, ulObjRefCount, This );
/* Deallocate if this is the last reference to the object */ if( !ref )
if( ulObjRefCount == 0 )
{ {
DPLSP_DestroyDPLobbySP( This ); DPLSP_DestroyDPLobbySP( This );
DPLSP_DestroyIUnknown( This ); DPLSP_DestroyIUnknown( This );
}
if( ulInterfaceRefCount == 0 )
{
HeapFree( GetProcessHeap(), 0, This ); HeapFree( GetProcessHeap(), 0, This );
} }
return ulInterfaceRefCount; return ref;
} }
static HRESULT WINAPI IDPLobbySPImpl_AddGroupToGroup( IDPLobbySP *iface, static HRESULT WINAPI IDPLobbySPImpl_AddGroupToGroup( IDPLobbySP *iface,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment