13 #if XMALLOC_STATISTICS
14 #define XMS_DBG_MAXSIZE (1024*1024)
15 #define XMS_DBG_SPLIT (256)
16 #define XMS_DBG_GRAIN (16)
17 #define XMS_DBG_GRAIN_SM (4)
18 #define XMS_DBG_OFFSET (XMS_DBG_SPLIT/XMS_DBG_GRAIN_SM - XMS_DBG_SPLIT/XMS_DBG_GRAIN )
19 #define XMS_DBG_MAXINDEX (XMS_DBG_MAXSIZE/XMS_DBG_GRAIN + XMS_DBG_OFFSET)
20 static int malloc_sizes[XMS_DBG_MAXINDEX + 1];
21 static int malloc_histo[XMS_DBG_MAXINDEX + 1];
22 static int dbg_stat_init = 0;
27 if (
sz >= XMS_DBG_MAXSIZE)
28 return XMS_DBG_MAXINDEX;
30 if (
sz <= XMS_DBG_SPLIT)
31 return (
sz + XMS_DBG_GRAIN_SM - 1) / XMS_DBG_GRAIN_SM;
33 return (
sz + XMS_DBG_GRAIN - 1) / XMS_DBG_GRAIN + XMS_DBG_OFFSET;
39 for (
int i = 0; i <= XMS_DBG_MAXINDEX; ++i)
40 malloc_sizes[i] = malloc_histo[i] = 0;
51 return malloc_sizes[XMS_DBG_INDEX(
sz)] += 1;
55 malloc_statistics(
void (*
func) (
int,
int,
int,
void *),
void *
data)
59 for (; i <= XMS_DBG_SPLIT; i += XMS_DBG_GRAIN_SM)
60 func(i, malloc_sizes[XMS_DBG_INDEX(i)], malloc_histo[XMS_DBG_INDEX(i)],
data);
62 i -= XMS_DBG_GRAIN_SM;
64 for (; i <= XMS_DBG_MAXSIZE; i += XMS_DBG_GRAIN)
65 func(i, malloc_sizes[XMS_DBG_INDEX(i)], malloc_histo[XMS_DBG_INDEX(i)],
data);
67 memcpy(&malloc_histo, &malloc_sizes,
sizeof(malloc_sizes));
83 void *p = calloc(n,
sz);
89 snprintf(msg, 128,
"xcalloc: Unable to allocate %" PRIuSIZE
" blocks of %" PRIuSIZE
" bytes!\n", n,
sz);
97 #if XMALLOC_STATISTICS
114 void *p = malloc(
sz);
119 static char msg[128];
120 snprintf(msg, 128,
"xmalloc: Unable to allocate %" PRIuSIZE
" bytes!\n",
sz);
128 #if XMALLOC_STATISTICS
145 void *p= realloc(s,
sz);
150 static char msg[128];
151 snprintf(msg, 128,
"xrealloc: Unable to reallocate %" PRIuSIZE
" bytes!\n",
sz);
160 #if XMALLOC_STATISTICS
171 void *s =
const_cast<void *
>(s_const);