void *mmap_addr;
size_t mmap_len;
+ size_t allocated_items;
+
/* Track alloc/free. */
unsigned long *alloc_bitmap;
};
addr = (void __rseq_percpu *) (range->base + item_offset);
range->next_unused += pool->item_len;
end:
- if (addr)
+ if (addr) {
+ range->allocated_items++;
set_alloc_slot(pool, range, item_offset);
+ }
pthread_mutex_unlock(&pool->lock);
if (addr) {
if (zeroed)
pthread_mutex_lock(&pool->lock);
clear_alloc_slot(pool, range, item_offset);
+ if (!range->allocated_items) {
+ fprintf(stderr, "%s: Trying to free an item from an empty pool range within pool \"%s\" (%p), item offset: %zu, caller: %p.\n",
+ __func__, get_pool_name(pool), pool, item_offset,
+ (void *) __builtin_return_address(0));
+ abort();
+ }
+ range->allocated_items--;
/* Add ptr to head of free list */
head = pool->free_list_head;
if (pool->attr.poison_set)