added some more statistics in xma
This commit is contained in:
parent
02748cd24d
commit
af13a3363c
@ -72,9 +72,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <hcl-cmn.h>
|
#include <hcl-cmn.h>
|
||||||
|
|
||||||
#ifdef HCL_BUILD_DEBUG
|
|
||||||
#define HCL_XMA_ENABLE_STAT
|
#define HCL_XMA_ENABLE_STAT
|
||||||
#endif
|
|
||||||
|
|
||||||
/** @struct hcl_xma_t
|
/** @struct hcl_xma_t
|
||||||
* The hcl_xma_t type defines a simple memory allocator over a memory zone.
|
* The hcl_xma_t type defines a simple memory allocator over a memory zone.
|
||||||
@ -105,14 +103,22 @@ struct hcl_xma_t
|
|||||||
/** pre-computed value for fast xfree index calculation */
|
/** pre-computed value for fast xfree index calculation */
|
||||||
hcl_oow_t bdec;
|
hcl_oow_t bdec;
|
||||||
|
|
||||||
#ifdef HCL_XMA_ENABLE_STAT
|
#if defined(HCL_XMA_ENABLE_STAT)
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
hcl_oow_t total;
|
hcl_oow_t total;
|
||||||
hcl_oow_t alloc;
|
hcl_oow_t alloc; /* allocated size */
|
||||||
hcl_oow_t avail;
|
hcl_oow_t avail; /* available size */
|
||||||
hcl_oow_t nused;
|
hcl_oow_t nused; /* nubmer of used blocks */
|
||||||
hcl_oow_t nfree;
|
hcl_oow_t nfree; /* number of free blocks */
|
||||||
|
hcl_oow_t alloc_hwmark; /* high watermark - highest total memory ever allocated */
|
||||||
|
hcl_oow_t nallocops; /* number of alloc operations */
|
||||||
|
hcl_oow_t nallocgoodops; /* number of successful alloc operations */
|
||||||
|
hcl_oow_t nallocbadops; /* number of failed alloc operations */
|
||||||
|
hcl_oow_t nreallocops; /* number of realloc operations */
|
||||||
|
hcl_oow_t nreallocgoodops; /* number of good realloc operations */
|
||||||
|
hcl_oow_t nreallocbadops; /* number of failed realloc operations - could fall back to normal alloc*/
|
||||||
|
hcl_oow_t nfreeops; /* number of free operations */
|
||||||
} stat;
|
} stat;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
@ -977,8 +977,7 @@ hcl_pfbase_t* hcl_querymod (hcl_t* hcl, const hcl_ooch_t* pfid, hcl_oow_t pfidle
|
|||||||
|
|
||||||
*mod = &mdp->mod;
|
*mod = &mdp->mod;
|
||||||
|
|
||||||
HCL_DEBUG4 (hcl, "Found a primitive function [%.*js] in a module [%js] - %p\n",
|
HCL_DEBUG4(hcl, "Found a primitive function [%.*js] in a module [%js] - %p\n", pfidlen - mod_name_len - 1, sep + 1, mdp->mod.name, pfbase);
|
||||||
pfidlen - mod_name_len - 1, sep + 1, mdp->mod.name, pfbase);
|
|
||||||
return pfbase;
|
return pfbase;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
75
lib/xma.c
75
lib/xma.c
@ -272,6 +272,15 @@ int hcl_xma_init (hcl_xma_t* xma, hcl_mmgr_t* mmgr, void* zoneptr, hcl_oow_t zon
|
|||||||
xma->stat.avail = zonesize - MBLKHDRSIZE;
|
xma->stat.avail = zonesize - MBLKHDRSIZE;
|
||||||
xma->stat.nfree = 1;
|
xma->stat.nfree = 1;
|
||||||
xma->stat.nused = 0;
|
xma->stat.nused = 0;
|
||||||
|
xma->stat.alloc_hwmark = 0;
|
||||||
|
|
||||||
|
xma->stat.nallocops = 0;
|
||||||
|
xma->stat.nallocgoodops = 0;
|
||||||
|
xma->stat.nallocbadops = 0;
|
||||||
|
xma->stat.nreallocops = 0;
|
||||||
|
xma->stat.nreallocgoodops = 0;
|
||||||
|
xma->stat.nreallocbadops = 0;
|
||||||
|
xma->stat.nfreeops = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -394,6 +403,7 @@ static hcl_xma_fblk_t* alloc_from_freelist (hcl_xma_t* xma, hcl_oow_t xfi, hcl_o
|
|||||||
xma->stat.nused++;
|
xma->stat.nused++;
|
||||||
xma->stat.alloc += cand->size;
|
xma->stat.alloc += cand->size;
|
||||||
xma->stat.avail -= cand->size;
|
xma->stat.avail -= cand->size;
|
||||||
|
if (xma->stat.alloc > xma->stat.alloc_hwmark) xma->stat.alloc_hwmark = xma->stat.alloc;
|
||||||
#endif
|
#endif
|
||||||
return cand;
|
return cand;
|
||||||
}
|
}
|
||||||
@ -410,6 +420,10 @@ void* hcl_xma_alloc (hcl_xma_t* xma, hcl_oow_t size)
|
|||||||
|
|
||||||
DBG_VERIFY(xma, "alloc start");
|
DBG_VERIFY(xma, "alloc start");
|
||||||
|
|
||||||
|
#if defined(HCL_XMA_ENABLE_STAT)
|
||||||
|
xma->stat.nallocops++;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* round up 'size' to the multiples of ALIGN */
|
/* round up 'size' to the multiples of ALIGN */
|
||||||
if (size < MINALLOCSIZE) size = MINALLOCSIZE;
|
if (size < MINALLOCSIZE) size = MINALLOCSIZE;
|
||||||
size = HCL_ALIGN_POW2(size, ALIGN);
|
size = HCL_ALIGN_POW2(size, ALIGN);
|
||||||
@ -434,13 +448,20 @@ void* hcl_xma_alloc (hcl_xma_t* xma, hcl_oow_t size)
|
|||||||
xma->stat.nused++;
|
xma->stat.nused++;
|
||||||
xma->stat.alloc += cand->size;
|
xma->stat.alloc += cand->size;
|
||||||
xma->stat.avail -= cand->size;
|
xma->stat.avail -= cand->size;
|
||||||
|
if (xma->stat.alloc > xma->stat.alloc_hwmark) xma->stat.alloc_hwmark = xma->stat.alloc;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (xfi == XFIMAX(xma))
|
else if (xfi == XFIMAX(xma))
|
||||||
{
|
{
|
||||||
/* huge block */
|
/* huge block */
|
||||||
cand = alloc_from_freelist(xma, XFIMAX(xma), size);
|
cand = alloc_from_freelist(xma, XFIMAX(xma), size);
|
||||||
if (!cand) return HCL_NULL;
|
if (!cand)
|
||||||
|
{
|
||||||
|
#if defined(HCL_XMA_ENABLE_STAT)
|
||||||
|
xma->stat.nallocbadops++;
|
||||||
|
#endif
|
||||||
|
return HCL_NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -469,10 +490,19 @@ void* hcl_xma_alloc (hcl_xma_t* xma, hcl_oow_t size)
|
|||||||
cand = alloc_from_freelist(xma, xfi, size);
|
cand = alloc_from_freelist(xma, xfi, size);
|
||||||
if (cand) break;
|
if (cand) break;
|
||||||
}
|
}
|
||||||
if (!cand) return HCL_NULL;
|
if (!cand)
|
||||||
|
{
|
||||||
|
#if defined(HCL_XMA_ENABLE_STAT)
|
||||||
|
xma->stat.nallocbadops++;
|
||||||
|
#endif
|
||||||
|
return HCL_NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(HCL_XMA_ENABLE_STAT)
|
||||||
|
xma->stat.nallocgoodops++;
|
||||||
|
#endif
|
||||||
DBG_VERIFY(xma, "alloc end");
|
DBG_VERIFY(xma, "alloc end");
|
||||||
return SYS_TO_USR(cand);
|
return SYS_TO_USR(cand);
|
||||||
}
|
}
|
||||||
@ -529,6 +559,7 @@ static void* _realloc_merge (hcl_xma_t* xma, void* b, hcl_oow_t size)
|
|||||||
#if defined(HCL_XMA_ENABLE_STAT)
|
#if defined(HCL_XMA_ENABLE_STAT)
|
||||||
xma->stat.alloc += req;
|
xma->stat.alloc += req;
|
||||||
xma->stat.avail -= req; /* req + MBLKHDRSIZE(tmp) - MBLKHDRSIZE(n) */
|
xma->stat.avail -= req; /* req + MBLKHDRSIZE(tmp) - MBLKHDRSIZE(n) */
|
||||||
|
if (xma->stat.alloc > xma->stat.alloc_hwmark) xma->stat.alloc_hwmark = xma->stat.alloc;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -546,6 +577,7 @@ static void* _realloc_merge (hcl_xma_t* xma, void* b, hcl_oow_t size)
|
|||||||
xma->stat.nfree--;
|
xma->stat.nfree--;
|
||||||
xma->stat.alloc += MBLKHDRSIZE + n->size;
|
xma->stat.alloc += MBLKHDRSIZE + n->size;
|
||||||
xma->stat.avail -= n->size;
|
xma->stat.avail -= n->size;
|
||||||
|
if (xma->stat.alloc > xma->stat.alloc_hwmark) xma->stat.alloc_hwmark = xma->stat.alloc;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -626,7 +658,7 @@ void* hcl_xma_realloc (hcl_xma_t* xma, void* b, hcl_oow_t size)
|
|||||||
{
|
{
|
||||||
void* n;
|
void* n;
|
||||||
|
|
||||||
if (b == HCL_NULL)
|
if (!b)
|
||||||
{
|
{
|
||||||
/* 'realloc' with NULL is the same as 'alloc' */
|
/* 'realloc' with NULL is the same as 'alloc' */
|
||||||
n = hcl_xma_alloc(xma, size);
|
n = hcl_xma_alloc(xma, size);
|
||||||
@ -634,9 +666,15 @@ void* hcl_xma_realloc (hcl_xma_t* xma, void* b, hcl_oow_t size)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* try reallocation by merging the adjacent continuous blocks */
|
/* try reallocation by merging the adjacent continuous blocks */
|
||||||
|
#if defined(HAWK_XMA_ENABLE_STAT)
|
||||||
|
xma->stat.nreallocops++;
|
||||||
|
#endif
|
||||||
n = _realloc_merge(xma, b, size);
|
n = _realloc_merge(xma, b, size);
|
||||||
if (!n)
|
if (!n)
|
||||||
{
|
{
|
||||||
|
#if defined(HCL_XMA_ENABLE_STAT)
|
||||||
|
xma->stat.nreallocbadops++;
|
||||||
|
#endif
|
||||||
/* reallocation by merging failed. fall back to the slow
|
/* reallocation by merging failed. fall back to the slow
|
||||||
* allocation-copy-free scheme */
|
* allocation-copy-free scheme */
|
||||||
n = hcl_xma_alloc(xma, size);
|
n = hcl_xma_alloc(xma, size);
|
||||||
@ -646,6 +684,12 @@ void* hcl_xma_realloc (hcl_xma_t* xma, void* b, hcl_oow_t size)
|
|||||||
hcl_xma_free(xma, b);
|
hcl_xma_free(xma, b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if defined(HCL_XMA_ENABLE_STAT)
|
||||||
|
xma->stat.nreallocgoodops++;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
@ -665,6 +709,7 @@ void hcl_xma_free (hcl_xma_t* xma, void* b)
|
|||||||
/* update statistical variables */
|
/* update statistical variables */
|
||||||
xma->stat.nused--;
|
xma->stat.nused--;
|
||||||
xma->stat.alloc -= org_blk_size;
|
xma->stat.alloc -= org_blk_size;
|
||||||
|
xma->stat.nfreeops++;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
x = prev_mblk(blk);
|
x = prev_mblk(blk);
|
||||||
@ -800,13 +845,14 @@ void hcl_xma_dump (hcl_xma_t* xma, hcl_xma_dumper_t dumper, void* ctx)
|
|||||||
hcl_oow_t isum;
|
hcl_oow_t isum;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
dumper (ctx, "<XMA DUMP>\n");
|
dumper(ctx, "[XMA DUMP]\n");
|
||||||
|
|
||||||
#if defined(HCL_XMA_ENABLE_STAT)
|
#if defined(HCL_XMA_ENABLE_STAT)
|
||||||
dumper(ctx, "== statistics ==\n");
|
dumper(ctx, "== statistics ==\n");
|
||||||
dumper (ctx, "total = %zu\n", xma->stat.total);
|
dumper(ctx, "Total = %zu\n", xma->stat.total);
|
||||||
dumper (ctx, "alloc = %zu\n", xma->stat.alloc);
|
dumper(ctx, "Alloc = %zu\n", xma->stat.alloc);
|
||||||
dumper (ctx, "avail = %zu\n", xma->stat.avail);
|
dumper(ctx, "Avail = %zu\n", xma->stat.avail);
|
||||||
|
dumper(ctx, "Alloc High Watermark = %zu\n", xma->stat.alloc_hwmark);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
dumper(ctx, "== blocks ==\n");
|
dumper(ctx, "== blocks ==\n");
|
||||||
@ -830,13 +876,20 @@ void hcl_xma_dump (hcl_xma_t* xma, hcl_xma_dumper_t dumper, void* ctx)
|
|||||||
#if defined(HCL_XMA_ENABLE_STAT)
|
#if defined(HCL_XMA_ENABLE_STAT)
|
||||||
dumper(ctx, "Internal use : %18zu bytes\n", isum);
|
dumper(ctx, "Internal use : %18zu bytes\n", isum);
|
||||||
dumper(ctx, "Total : %18zu bytes\n", (asum + fsum + isum));
|
dumper(ctx, "Total : %18zu bytes\n", (asum + fsum + isum));
|
||||||
|
dumper(ctx, "Alloc operations : %18zu\n", xma->stat.nallocops);
|
||||||
|
dumper(ctx, "Good alloc operations : %18zu\n", xma->stat.nallocgoodops);
|
||||||
|
dumper(ctx, "Bad alloc operations : %18zu\n", xma->stat.nallocbadops);
|
||||||
|
dumper(ctx, "Realloc operations : %18zu\n", xma->stat.nreallocops);
|
||||||
|
dumper(ctx, "Good realloc operations: %18zu\n", xma->stat.nreallocgoodops);
|
||||||
|
dumper(ctx, "Bad realloc operations : %18zu\n", xma->stat.nreallocbadops);
|
||||||
|
dumper(ctx, "Free operations : %18zu\n", xma->stat.nfreeops);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HCL_XMA_ENABLE_STAT)
|
#if defined(HCL_XMA_ENABLE_STAT)
|
||||||
assert (asum == xma->stat.alloc);
|
HCL_ASSERT(hcl, asum == xma->stat.alloc);
|
||||||
assert (fsum == xma->stat.avail);
|
HCL_ASSERT(hcl, fsum == xma->stat.avail);
|
||||||
assert (isum == xma->stat.total - (xma->stat.alloc + xma->stat.avail));
|
HCL_ASSERT(hcl, isum == xma->stat.total - (xma->stat.alloc + xma->stat.avail));
|
||||||
assert (asum + fsum + isum == xma->stat.total);
|
HCL_ASSERT(hcl, asum + fsum + isum == xma->stat.total);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user