]>
git.ipfire.org Git - thirdparty/squid.git/blob - compat/xalloc.cc
2 #include "compat/xalloc.h"
3 #include "profiler/Profiler.h"
6 #define XMS_DBG_MAXSIZE (1024*1024)
7 #define XMS_DBG_SPLIT (256) /* mallocs below this value are tracked with DBG_GRAIN_SM precision instead of DBG_GRAIN */
8 #define XMS_DBG_GRAIN (16)
9 #define XMS_DBG_GRAIN_SM (4)
10 #define XMS_DBG_OFFSET (XMS_DBG_SPLIT/XMS_DBG_GRAIN_SM - XMS_DBG_SPLIT/XMS_DBG_GRAIN )
11 #define XMS_DBG_MAXINDEX (XMS_DBG_MAXSIZE/XMS_DBG_GRAIN + XMS_DBG_OFFSET)
12 static int malloc_sizes
[XMS_DBG_MAXINDEX
+ 1];
13 static int malloc_histo
[XMS_DBG_MAXINDEX
+ 1];
14 static int dbg_stat_init
= 0;
19 if (sz
>= XMS_DBG_MAXSIZE
)
20 return XMS_DBG_MAXINDEX
;
22 if (sz
<= XMS_DBG_SPLIT
)
23 return (sz
+ XMS_DBG_GRAIN_SM
- 1) / XMS_DBG_GRAIN_SM
;
25 return (sz
+ XMS_DBG_GRAIN
- 1) / XMS_DBG_GRAIN
+ XMS_DBG_OFFSET
;
31 for (int i
= 0; i
<= XMS_DBG_MAXINDEX
; i
++)
32 malloc_sizes
[i
] = malloc_histo
[i
] = 0;
43 return malloc_sizes
[XMS_DBG_INDEX(sz
)] += 1;
47 malloc_statistics(void (*func
) (int, int, int, void *), void *data
)
51 for (; i
<= XMS_DBG_SPLIT
; i
+= XMS_DBG_GRAIN_SM
)
52 func(i
, malloc_sizes
[XMS_DBG_INDEX(i
)], malloc_histo
[XMS_DBG_INDEX(i
)], data
);
54 i
-= XMS_DBG_GRAIN_SM
;
56 for (; i
<= XMS_DBG_MAXSIZE
; i
+= XMS_DBG_GRAIN
)
57 func(i
, malloc_sizes
[XMS_DBG_INDEX(i
)], malloc_histo
[XMS_DBG_INDEX(i
)], data
);
59 xmemcpy(&malloc_histo
, &malloc_sizes
, sizeof(malloc_sizes
));
61 #endif /* XMALLOC_STATISTICS */
64 xcalloc(size_t n
, size_t sz
)
75 void *p
= calloc(n
, sz
);
81 snprintf(msg
, 128, "xcalloc: Unable to allocate %Zu blocks of %Zu bytes!\n", n
, sz
);
82 (*failure_notify
) (msg
);
90 check_malloc(p
, sz
* n
);
92 #if XMALLOC_STATISTICS
96 xmalloc_show_trace(p
, 1);
100 fprintf(tracefp
, "c:%u:%u:%p\n", (unsigned int) n
, (unsigned int) sz
, p
);
116 void *p
= malloc(sz
);
120 if (failure_notify
) {
121 static char msg
[128];
122 snprintf(msg
, 128, "xmalloc: Unable to allocate %Zu bytes!\n", sz
);
123 (*failure_notify
) (msg
);
133 #if XMALLOC_STATISTICS
137 xmalloc_show_trace(p
, 1);
141 fprintf(tracefp
, "m:%d:%p\n", sz
, p
);
149 xrealloc(void *s
, size_t sz
)
151 PROF_start(xrealloc
);
153 xmalloc_show_trace(s
, -1);
164 void *p
= realloc(s
, sz
);
168 if (failure_notify
) {
169 static char msg
[128];
170 snprintf(msg
, 128, "xrealloc: Unable to reallocate %Zu bytes!\n", sz
);
171 (*failure_notify
) (msg
);
182 #if XMALLOC_STATISTICS
186 xmalloc_show_trace(p
, 1);
189 if (tracefp
) /* new ptr, old ptr, new size */
190 fprintf(tracefp
, "r:%p:%p:%d\n", p
, s
, sz
);
206 free_const(const void *s_const
)
208 void *s
= const_cast<void *>(s_const
);
210 PROF_start(free_const
);
212 xmalloc_show_trace(s
, -1);
225 fprintf(tracefp
, "f:%p\n", s
);
227 PROF_stop(free_const
);