summaryrefslogtreecommitdiff
path: root/pkmem.h
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2024-10-16 07:08:15 -0400
committerJonathan Bradley <jcb@pikum.xyz>2024-10-16 07:08:15 -0400
commitb79beeafcb2feec7fbf830034ddcd61e03297283 (patch)
tree3828b5933f5beaffc2ecb173ba668f59d82c2320 /pkmem.h
parent12042ad970c1312bf7901ca9694d1137962676d1 (diff)
pkmem: first-pass memory debugger track bucket
Diffstat (limited to 'pkmem.h')
-rw-r--r--pkmem.h53
1 files changed, 33 insertions, 20 deletions
diff --git a/pkmem.h b/pkmem.h
index ec6719d..d4672a2 100644
--- a/pkmem.h
+++ b/pkmem.h
@@ -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;