diff options
author | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | 2024-04-12 14:59:39 -0400 |
---|---|---|
committer | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | 2024-04-12 14:59:39 -0400 |
commit | ffea0dea60059c855cb0b4e1f784352012ae0b37 (patch) | |
tree | e091424b0e1e7572cc77ecfa9bb0b4fc21ce8a5a | |
parent | fffc02aa88d919732cdb91c39885bf2a800f997d (diff) | |
download | librseq-ffea0dea60059c855cb0b4e1f784352012ae0b37.tar.gz |
mempool: Track allocated items per range
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I48c05318c39b3f3bcf9c14a5aa3181e29754db97
-rw-r--r-- | src/rseq-mempool.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/rseq-mempool.c b/src/rseq-mempool.c index 730435d..83b317d 100644 --- a/src/rseq-mempool.c +++ b/src/rseq-mempool.c @@ -137,6 +137,8 @@ struct rseq_mempool_range { void *mmap_addr; size_t mmap_len; + size_t allocated_items; + /* Track alloc/free. */ unsigned long *alloc_bitmap; }; @@ -1095,8 +1097,10 @@ void __rseq_percpu *__rseq_percpu_malloc(struct rseq_mempool *pool, 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) @@ -1161,6 +1165,13 @@ void librseq_mempool_percpu_free(void __rseq_percpu *_ptr, size_t stride) 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) |