Commit 744f94be authored by Michael Stefaniuc's avatar Michael Stefaniuc Committed by Alexandre Julliard

dplayx: Simplify ref-counting for IDirectPlaySP.

parent 008cc608
...@@ -44,7 +44,6 @@ typedef struct IDirectPlaySPImpl IDirectPlaySPImpl; ...@@ -44,7 +44,6 @@ typedef struct IDirectPlaySPImpl IDirectPlaySPImpl;
typedef struct tagDirectPlaySPIUnknownData typedef struct tagDirectPlaySPIUnknownData
{ {
LONG ulObjRef;
CRITICAL_SECTION DPSP_lock; CRITICAL_SECTION DPSP_lock;
} DirectPlaySPIUnknownData; } DirectPlaySPIUnknownData;
...@@ -61,13 +60,13 @@ typedef struct tagDirectPlaySPData ...@@ -61,13 +60,13 @@ typedef struct tagDirectPlaySPData
} DirectPlaySPData; } DirectPlaySPData;
#define DPSP_IMPL_FIELDS \ #define DPSP_IMPL_FIELDS \
LONG ulInterfaceRef; \
DirectPlaySPIUnknownData* unk; \ DirectPlaySPIUnknownData* unk; \
DirectPlaySPData* sp; DirectPlaySPData* sp;
struct IDirectPlaySPImpl struct IDirectPlaySPImpl
{ {
const IDirectPlaySPVtbl *lpVtbl; const IDirectPlaySPVtbl *lpVtbl;
LONG ref;
DPSP_IMPL_FIELDS DPSP_IMPL_FIELDS
}; };
...@@ -194,79 +193,47 @@ static inline IDirectPlaySPImpl *impl_from_IDirectPlaySP( IDirectPlaySP *iface ) ...@@ -194,79 +193,47 @@ static inline IDirectPlaySPImpl *impl_from_IDirectPlaySP( IDirectPlaySP *iface )
} }
static HRESULT WINAPI IDirectPlaySPImpl_QueryInterface( IDirectPlaySP *iface, REFIID riid, static HRESULT WINAPI IDirectPlaySPImpl_QueryInterface( IDirectPlaySP *iface, REFIID riid,
void **ppvObj ) void **ppv )
{ {
IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)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_IDirectPlaySP, riid ) )
sizeof( *This ) );
if( *ppvObj == NULL )
{
return DPERR_OUTOFMEMORY;
}
CopyMemory( *ppvObj, This, sizeof( *This ) );
(*(IDirectPlaySPImpl**)ppvObj)->ulInterfaceRef = 0;
if( IsEqualGUID( &IID_IDirectPlaySP, riid ) )
{
IDirectPlaySPImpl *This = *ppvObj;
This->lpVtbl = &directPlaySPVT;
}
else
{ {
/* Unsupported interface */ *ppv = iface;
HeapFree( GetProcessHeap(), 0, *ppvObj ); IDirectPlaySP_AddRef( iface );
*ppvObj = NULL; return S_OK;
return E_NOINTERFACE;
} }
IDirectPlaySP_AddRef( (LPDIRECTPLAYSP)*ppvObj ); FIXME( "Unsupported interface %s\n", debugstr_guid( riid ) );
*ppv = NULL;
return S_OK; return E_NOINTERFACE;
} }
static ULONG WINAPI IDirectPlaySPImpl_AddRef( IDirectPlaySP *iface ) static ULONG WINAPI IDirectPlaySPImpl_AddRef( IDirectPlaySP *iface )
{ {
IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface ); IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( 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 IDirectPlaySPImpl_Release( IDirectPlaySP *iface ) static ULONG WINAPI IDirectPlaySPImpl_Release( IDirectPlaySP *iface )
{ {
IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( iface ); IDirectPlaySPImpl *This = impl_from_IDirectPlaySP( 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( ulObjRefCount == 0 )
{
DPSP_DestroyDirectPlaySP( This );
DPSP_DestroyIUnknown( This );
}
if( ulInterfaceRefCount == 0 ) if( !ref )
{ {
DPSP_DestroyDirectPlaySP( This );
DPSP_DestroyIUnknown( This );
HeapFree( GetProcessHeap(), 0, This ); HeapFree( GetProcessHeap(), 0, This );
} }
return ulInterfaceRefCount; return ref;
} }
static HRESULT WINAPI IDirectPlaySPImpl_AddMRUEntry( IDirectPlaySP *iface, LPCWSTR lpSection, static HRESULT WINAPI IDirectPlaySPImpl_AddMRUEntry( IDirectPlaySP *iface, LPCWSTR lpSection,
......
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