Commit bfaf9013 authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

compobj: Implement reference counting for the standard allocator.

parent 9af935a5
...@@ -111,8 +111,8 @@ static SEGPTR compobj_malloc; ...@@ -111,8 +111,8 @@ static SEGPTR compobj_malloc;
typedef struct typedef struct
{ {
IMalloc16 IMalloc16_iface; IMalloc16 IMalloc16_iface;
DWORD ref; LONG refcount;
} IMalloc16Impl; } IMalloc16Impl;
static inline IMalloc16Impl *impl_from_IMalloc16(IMalloc16 *iface) static inline IMalloc16Impl *impl_from_IMalloc16(IMalloc16 *iface)
...@@ -139,21 +139,28 @@ HRESULT CDECL IMalloc16_fnQueryInterface(IMalloc16* iface,REFIID refiid,LPVOID * ...@@ -139,21 +139,28 @@ HRESULT CDECL IMalloc16_fnQueryInterface(IMalloc16* iface,REFIID refiid,LPVOID *
/****************************************************************************** /******************************************************************************
* IMalloc16_AddRef [COMPOBJ.501] * IMalloc16_AddRef [COMPOBJ.501]
*/ */
ULONG CDECL IMalloc16_fnAddRef(IMalloc16* iface) { ULONG CDECL IMalloc16_fnAddRef(IMalloc16 *iface)
IMalloc16Impl *This = impl_from_IMalloc16(iface); {
IMalloc16Impl *malloc = impl_from_IMalloc16(iface);
TRACE("(%p)->AddRef()\n",This); ULONG refcount = InterlockedIncrement(&malloc->refcount);
return 1; /* cannot be freed */ TRACE("%p increasing refcount to %u.\n", malloc, refcount);
return refcount;
} }
/****************************************************************************** /******************************************************************************
* IMalloc16_Release [COMPOBJ.502] * IMalloc16_Release [COMPOBJ.502]
*/ */
ULONG CDECL IMalloc16_fnRelease(IMalloc16* iface) { ULONG CDECL IMalloc16_fnRelease(SEGPTR iface)
IMalloc16Impl *This = impl_from_IMalloc16(iface); {
IMalloc16Impl *malloc = impl_from_IMalloc16(MapSL(iface));
TRACE("(%p)->Release()\n",This); ULONG refcount = InterlockedDecrement(&malloc->refcount);
return 1; /* cannot be freed */ TRACE("%p decreasing refcount to %u.\n", malloc, refcount);
if (!refcount)
{
UnMapLS(iface);
HeapFree(GetProcessHeap(), 0, malloc);
}
return refcount;
} }
/****************************************************************************** /******************************************************************************
...@@ -257,11 +264,10 @@ static SEGPTR IMalloc16_Constructor(void) ...@@ -257,11 +264,10 @@ static SEGPTR IMalloc16_Constructor(void)
msegvt16 = MapLS( &vt16 ); msegvt16 = MapLS( &vt16 );
} }
This->IMalloc16_iface.lpVtbl = msegvt16; This->IMalloc16_iface.lpVtbl = msegvt16;
This->ref = 1; This->refcount = 1;
return MapLS(This); return MapLS(This);
} }
/****************************************************************************** /******************************************************************************
* CoBuildVersion [COMPOBJ.1] * CoBuildVersion [COMPOBJ.1]
*/ */
......
...@@ -209,7 +209,7 @@ ...@@ -209,7 +209,7 @@
# WINE internal relays (for Win16 interfaces) # WINE internal relays (for Win16 interfaces)
500 cdecl IMalloc16_QueryInterface(ptr ptr ptr) IMalloc16_fnQueryInterface 500 cdecl IMalloc16_QueryInterface(ptr ptr ptr) IMalloc16_fnQueryInterface
501 cdecl IMalloc16_AddRef(ptr) IMalloc16_fnAddRef 501 cdecl IMalloc16_AddRef(ptr) IMalloc16_fnAddRef
502 cdecl IMalloc16_Release(ptr) IMalloc16_fnRelease 502 cdecl IMalloc16_Release(segptr) IMalloc16_fnRelease
503 cdecl IMalloc16_Alloc(ptr long) IMalloc16_fnAlloc 503 cdecl IMalloc16_Alloc(ptr long) IMalloc16_fnAlloc
504 cdecl IMalloc16_Realloc(ptr segptr long) IMalloc16_fnRealloc 504 cdecl IMalloc16_Realloc(ptr segptr long) IMalloc16_fnRealloc
505 cdecl IMalloc16_Free(ptr segptr) IMalloc16_fnFree 505 cdecl IMalloc16_Free(ptr segptr) IMalloc16_fnFree
......
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