diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2024-10-16 07:08:15 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2024-10-16 07:08:15 -0400 |
| commit | b79beeafcb2feec7fbf830034ddcd61e03297283 (patch) | |
| tree | 3828b5933f5beaffc2ecb173ba668f59d82c2320 /pkmem.h | |
| parent | 12042ad970c1312bf7901ca9694d1137962676d1 (diff) | |
pkmem: first-pass memory debugger track bucket
Diffstat (limited to 'pkmem.h')
| -rw-r--r-- | pkmem.h | 53 |
1 files changed, 33 insertions, 20 deletions
@@ -156,7 +156,11 @@ static struct pk_membucket pk_buckets[8]; static int64_t pk_bucket_head = 0; #ifdef PK_MEMORY_DEBUGGER -static struct pk_memblock debug_all_allocs[1024 * 1024]; +struct pk_dbg_memblock { + struct pk_memblock blk; + struct pk_membucket *bkt; +}; +static struct pk_dbg_memblock debug_all_allocs[1024 * 1024]; static int64_t debug_alloc_head = 0; static bool has_init_debug = false; #endif @@ -186,8 +190,8 @@ pk_memory_debug_print() PK_LOGV_INF("\ttransient: %i\n", pk_buckets[i].transient); #ifdef PK_MEMORY_DEBUGGER uint64_t count = 0; - for (int64_t i = 0; i < debug_alloc_head; ++i) { - if (debug_all_allocs[i].size > 0) { + for (int64_t d = 0; d < debug_alloc_head; ++d) { + if (debug_all_allocs[d].bkt == &pk_buckets[d] && debug_all_allocs[d].blk.size > 0) { count += 1; } } @@ -226,7 +230,7 @@ pk_bucket_create_inner(int64_t sz, bool transient, const char* description) #ifdef PK_MEMORY_DEBUGGER if (has_init_debug == false) { has_init_debug = true; - memset(debug_all_allocs, 0, sizeof(struct pk_memblock) * 1024 * 1024); + memset(debug_all_allocs, 0, sizeof(struct pk_dbg_memblock) * 1024 * 1024); } #endif int64_t blockCount = sz * 0.01; @@ -374,20 +378,25 @@ pk_new_bkt(size_t sz, size_t alignment, struct pk_membucket* bkt) bool handled = bkt->transient; if (handled == false) { for (int64_t i = 0; i < debug_alloc_head; ++i) { - struct pk_memblock* mb = &debug_all_allocs[i]; - assert((mb->size == 0 || (void*)(mb->data) != data) && "mem address alloc'd twice!"); - if (mb->size == 0) { - mb->data = (char*)(data); - mb->size = sz; + struct pk_dbg_memblock* mb = &debug_all_allocs[i]; + if (mb->bkt != NULL) continue; + assert((mb->blk.size == 0 || (void*)(mb->blk.data) != data) && "mem address alloc'd twice!"); + if (mb->blk.size == 0) { + mb->blk.data = (char*)(data); + mb->blk.size = sz; + mb->bkt = bkt; handled = true; break; } } } if (handled == false) { - debug_all_allocs[debug_alloc_head++] = (struct pk_memblock){ - .data = (char*)(data), - .size = sz, + debug_all_allocs[debug_alloc_head++] = (struct pk_dbg_memblock){ + .blk = (struct pk_memblock) { + .data = (char*)(data), + .size = sz, + }, + .bkt = bkt, }; } #endif @@ -422,7 +431,8 @@ pk_new_bkt(size_t sz, size_t alignment, struct pk_membucket* bkt) int64_t debug_tracked_alloc_size = 0; int64_t debug_bucket_alloc_size = bkt->size - (sizeof(struct pk_memblock) * bkt->maxBlockCount); for (int64_t i = 0; i < debug_alloc_head; ++i) { - debug_tracked_alloc_size += debug_all_allocs[i].size; + if (debug_all_allocs[i].bkt != bkt) continue; + debug_tracked_alloc_size += debug_all_allocs[i].blk.size; } for (int64_t i = 0; i <= bkt->lastEmptyBlockIndex; ++i) { debug_bucket_alloc_size -= bkt->blocks[i].size; @@ -462,11 +472,13 @@ pk_delete_bkt(const void* ptr, size_t sz, struct pk_membucket* bkt) bool found = bkt->transient; if (found == false) { for (int64_t i = debug_alloc_head - 1; i > -1; --i) { - struct pk_memblock* mb = &debug_all_allocs[i]; - if (mb->size == 0) continue; - if ((void*)(mb->data) == ptr) { - assert(mb->size == sz && "[pk_MEMORY_HPP] incorrect free size"); - mb->size = 0; + struct pk_dbg_memblock* mb = &debug_all_allocs[i]; + if (mb->bkt != bkt) continue; + if (mb->blk.size == 0) continue; + if ((void*)(mb->blk.data) == ptr) { + assert(mb->blk.size == sz && "[PK_MEMORY_HPP] incorrect free size"); + mb->blk.size = 0; + mb->bkt = NULL; found = true; if (i == (debug_alloc_head - 1)) { debug_alloc_head--; @@ -475,7 +487,7 @@ pk_delete_bkt(const void* ptr, size_t sz, struct pk_membucket* bkt) } } } - assert(found && "[pk_MEMORY_HPP] double free or invalid ptr"); + assert(found && "[PK_MEMORY_HPP] double free or invalid ptr"); #endif bkt->allocs--; if (bkt->allocs == 0) { @@ -530,7 +542,8 @@ pk_delete_bkt(const void* ptr, size_t sz, struct pk_membucket* bkt) int64_t debug_tracked_alloc_size = 0; int64_t debug_bucket_alloc_size = bkt->size - (sizeof(struct pk_memblock) * bkt->maxBlockCount); for (int64_t i = 0; i < debug_alloc_head; ++i) { - debug_tracked_alloc_size += debug_all_allocs[i].size; + if (debug_all_allocs[i].bkt != bkt) continue; + debug_tracked_alloc_size += debug_all_allocs[i].blk.size; } for (int64_t i = 0; i <= bkt->lastEmptyBlockIndex; ++i) { debug_bucket_alloc_size -= bkt->blocks[i].size; |
