AcePerl
view release on metacpan or search on metacpan
acelib/memsubs.c view on Meta::CPAN
/* do handle finalisation first */
if (handle->final)
(*handle->final)((void *)handle->back);
while (unit)
{
#ifdef MALLOC_CHECK
checkUnit (unit) ;
unit->check1 = 0x87654321; /* test for double free */
#endif
if (unit->final)
(*unit->final)(toMemPtr(unit)) ;
next = unit->next ;
--numMessAlloc ;
totMessAlloc -= unit->size ;
free (unit) ;
unit = next ;
}
#ifdef MALLOC_CHECK
arrayRemove (handles, &p, handleOrder) ;
#endif
/* This is a finalisation routine, the actual store is freed in messfree,
or another invokation of itself. */
}
void handleSetFinalise(STORE_HANDLE handle, void (*final)(void *), void *arg)
{ handle->final = final;
handle->back = (STORE_HANDLE)arg;
}
STORE_HANDLE handleHandleCreate(STORE_HANDLE handle)
{
STORE_HANDLE res = (STORE_HANDLE) handleAlloc(handleFinalise,
handle,
sizeof(STORE_HANDLE_STRUCT));
#ifdef MALLOC_CHECK
/* NB call to handleAlloc above ensures that handles is initialised here */
arrayInsert (handles, &res, handleOrder) ;
#endif
res->next = res->back = 0 ; /* No blocks on this handle yet. */
res->final = 0 ; /* No handle finalisation */
return res ;
}
BOOL finalCleanup = FALSE ;
#ifdef MEM_DEBUG
void handleCleanUp (void)
{ finalCleanup = TRUE ;
handleFinalise ((void *)&handle0) ;
}
#endif
/************** checking functions, require MALLOC_CHECK *****/
#ifdef MALLOC_CHECK
static void checkUnit (STORE_HANDLE unit)
{
if (unit->check1 == 0x87654321)
messerror ("Block at %x freed twice - bad things will happen.",
toMemPtr(unit));
else
if (unit->check1 != 0x12345678)
messerror ("Malloc error at %x length %d: "
"start overwritten with %x",
toMemPtr(unit), unit->size, unit->check1) ;
if (check2(unit) != 0x12345678)
messerror ("Malloc error at %x length %d: "
"end overwritten with %x",
toMemPtr(unit), unit->size, check2(unit)) ;
}
void messalloccheck (void)
{
int i ;
STORE_HANDLE unit ;
if (!handles) return ;
for (i = 0 ; i < arrayMax(handles) ; ++i)
for (unit = arr(handles,i,STORE_HANDLE)->next ; unit ; unit=unit->next)
checkUnit (unit) ;
}
#else
void messalloccheck (void) {}
#endif
/******************* status monitoring functions ******************/
void handleInfo (STORE_HANDLE handle, int *number, int *size)
{
STORE_HANDLE unit = handle->next;
*number = 0;
*size = 0;
while (unit)
{ ++*number ;
*size += unit->size ;
unit = unit->next ;
}
}
int messAllocStatus (int *mem)
{
*mem = totMessAlloc ;
return numMessAlloc ;
}
/*************************** end of file ************************/
/****************************************************************/
( run in 4.921 seconds using v1.01-cache-2.11-cpan-5837b0d9d2c )