AcePerl
view release on metacpan or search on metacpan
acelib/arraysub.c view on Meta::CPAN
while (i-- && i > j)
{ a = arr (reportArray, i, Array) ;
if (arrayExists(a))
fprintf (stderr, "Array %d size=%d max=%d\n", i, a->size, a->max) ;
}
}
/**************/
void arrayStatus (int *nmadep, int *nusedp, int *memAllocp, int *memUsedp)
{
int i ;
Array a, *ap ;
*nmadep = totalNumberCreated ;
*nusedp = totalNumberActive ;
*memAllocp = totalAllocatedMemory ;
*memUsedp = 0 ;
if (reportArray == (Array)1)
return ;
i = arrayMax(reportArray) ;
ap = arrp(reportArray, 0, Array) - 1 ;
while (ap++, i--)
if (arrayExists (*ap))
{ a = *ap ;
*memUsedp += a->max * a->size ;
}
}
/**************/
Array uArrayReCreate (Array a, int n, int size)
{ if (!arrayExists(a))
return uArrayCreate(n, size, 0) ;
if(a->size != size)
messcrash("Type missmatch in uArrayRecreate, you should always "
"call recreate using the same type") ;
if (n < 1)
n = 1 ;
if (a->dim < n ||
(a->dim - n)*size > (1 << 19) ) /* free if save > 1/2 meg */
{ totalAllocatedMemory -= a->dim * size ;
messfree (a->base) ;
a->dim = n ;
totalAllocatedMemory += a->dim * size ;
a->base = messalloc (a->dim*size) ;
}
memset(a->base,0,(mysize_t)(a->dim*size)) ;
a->max = 0 ;
return a ;
}
/**************/
void uArrayDestroy (Array a)
/* Note that the finalisation code attached to the memory does the work,
see below */
{
if (!a) return;
if (a->magic != ARRAY_MAGIC)
messcrash ("uArrayDestroy received corrupt array->magic");
messfree(a);
}
static void uArrayFinalise (void *cp)
{ Array a = (Array)cp;
totalAllocatedMemory -= a->dim * a->size ;
if (!finalCleanup) messfree (a->base) ;
a->magic = 0 ;
totalNumberActive-- ;
if (!finalCleanup && reportArray != (Array)1)
arr(reportArray, a->id, Array) = 0 ;
}
/******************************/
#ifndef MEM_DEBUG
void arrayExtend (Array a, int n)
#else
void arrayExtend_dbg (Array a, int n, const char *hfname,int hlineno)
#endif
{
char *new ;
if (!a || n < a->dim)
return ;
totalAllocatedMemory -= a->dim * a->size ;
if (a->dim*a->size < 1 << 23) /* 2 megs of keys, or 8 megs of ram */
a->dim *= 2 ;
else
a->dim += 1024 + ((1 << 23) / a->size) ;
if (n >= a->dim)
a->dim = n + 1 ;
totalAllocatedMemory += a->dim * a->size ;
#ifndef MEM_DEBUG
new = messalloc (a->dim*a->size) ;
#else
new = messalloc_dbg (a->dim*a->size,dbgPos(hfname, hlineno, __FILE__), __LINE__) ;
#endif
memcpy (new,a->base,a->size*a->max) ;
messfree (a->base) ;
a->base = new ;
}
/***************/
char *uArray (Array a, int i)
{
if (i < 0)
messcrash ("referencing array element %d < 0", i) ;
if (!a)
( run in 1.136 second using v1.01-cache-2.11-cpan-99c4e6809bf )