77 #define BLKID_SHIFT 16
78 #define BLKID_MASK ((1<<BLKID_SHIFT)-1)
84 char *caller_file,
int caller_line);
91 if ((elemsize %
sizeof(
void *)) != 0) {
92 size_t rounded = (elemsize +
sizeof(
void *) - 1) & ~(
sizeof(
void *)-1);
94 (
"List item size (%lu) not multiple of sizeof(void *), rounding to %lu\n",
95 (
unsigned long)elemsize,
96 (
unsigned long)rounded);
106 list->
blk_alloc = (1 << 18) / (MIN_ALLOC * elemsize);
108 E_ERROR(
"Element size * block size exceeds 256k, use malloc instead.\n");
116 listelem_add_block(list, __FILE__, __LINE__);
126 for (gn = list->
blocks; gn; gn = gnode_next(gn))
134 listelem_add_block(
listelem_alloc_t *list,
char *caller_file,
int caller_line)
147 if (blocksize * list->
elemsize > (1 << 18))
148 blocksize = (1 << 18) / list->
elemsize;
154 (
char **) __ckd_calloc__(blocksize, list->
elemsize,
155 caller_file, caller_line);
160 for (j = blocksize - 1; j > 0; --j) {
173 __listelem_malloc__(
listelem_alloc_t *list,
char *caller_file,
int caller_line)
179 listelem_add_block(list, caller_file, caller_line);
191 int caller_line, int32 *out_id)
197 listelem_add_block(list, caller_file, caller_line);
205 int32 blksize, blkidx, ptridx;
212 for (gn = list->
blocks; gn; gn = gnode_next(gn)) {
214 blksize = gnode_int32(gn2) * list->
elemsize /
sizeof(*block);
215 if (ptr >= block && ptr < block + blksize)
217 gn2 = gnode_next(gn2);
221 E_ERROR(
"Failed to find block index for pointer %p!\n", ptr);
223 ptridx = (ptr - block) / (list->
elemsize /
sizeof(*block));
224 E_DEBUG(4,(
"ptr %p block %p blkidx %d ptridx %d\n",
225 ptr, block, list->n_blocks - blkidx - 1, ptridx));
226 *out_id = ((list->n_blocks - blkidx - 1) << BLKID_SHIFT) | ptridx;
235 int32 blkidx, ptridx, i;
238 blkidx = (
id >> BLKID_SHIFT) & BLKID_MASK;
239 ptridx =
id & BLKID_MASK;
242 blkidx = list->n_blocks - blkidx;
243 for (gn = list->
blocks; gn; gn = gnode_next(gn)) {
248 E_ERROR(
"Failed to find block index %d\n", blkidx);
253 + ptridx * (list->
elemsize /
sizeof(
void *)));
258 char *caller_file,
int caller_line)
265 cpp = (
char **) elem;
279 E_INFO(
"Linklist stats:\n");
280 for (n = 0, cpp = list->
freelist; cpp;
281 cpp = (
char **) (*cpp), n++);
283 (
"elemsize %lu, #alloc %lu, #freed %lu, #freelist %lu\n",
285 (
unsigned long)list->n_alloc,
286 (
unsigned long)list->n_freed,
288 E_INFO(
"Allocated blocks:\n");
290 for (gn = list->
blocks; gn; gn = gnode_next(gn)) {
292 gn2 = gnode_next(gn2);