summaryrefslogtreecommitdiff
path: root/pkmem.h
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-02-19 17:18:45 -0500
committerJonathan Bradley <jcb@pikum.xyz>2025-02-19 17:18:45 -0500
commitea5dfe4a613937dd4ac950fe2df45a4a10a5ea18 (patch)
treefd25ebb912f932afe67d58398ddc4815bbe94f77 /pkmem.h
parent5b50b5b6dcee28625e91ed1b5f2a938e1ca3f54c (diff)
pkmem: pk_delete_bkt unlock mtx on early exit
Diffstat (limited to 'pkmem.h')
-rw-r--r--pkmem.h16
1 files changed, 12 insertions, 4 deletions
diff --git a/pkmem.h b/pkmem.h
index d4bb80a..5ddb137 100644
--- a/pkmem.h
+++ b/pkmem.h
@@ -355,7 +355,8 @@ pk_bucket_insert_block(struct pk_membucket* bkt, const struct pk_memblock* block
}
void
-pk_bucket_collapse_empty_blocks(struct pk_membucket* bkt) {
+pk_bucket_collapse_empty_blocks(struct pk_membucket* bkt)
+{
size_t i, ii;
for (ii = bkt->lastEmptyBlockIndex+1; ii > 0; --ii) {
i = ii-1;
@@ -382,6 +383,7 @@ pk_new_bkt(size_t sz, size_t alignment, struct pk_membucket* bkt)
#ifdef PK_MEMORY_FORCE_MALLOC
return malloc(sz);
#endif
+ assert((bkt->size - bkt->head) > (sz + alignment -1) && "Not enough space in bucket");
if (sz == 0) return nullptr;
size_t i;
size_t calculatedAlignment = alignment < PK_MINIMUM_ALIGNMENT ? PK_MINIMUM_ALIGNMENT : alignment;
@@ -483,10 +485,14 @@ pk_new_base(size_t sz, size_t alignment)
{
struct pk_membucket* bkt = nullptr;
for (size_t i = 0; i < pk_bucket_head; ++i) {
- if (pk_buckets[i].transient == false && pk_buckets[i].size - pk_buckets[i].head > sz + PK_MAXIMUM_ALIGNMENT) {
- bkt = &pk_buckets[i];
- break;
+ if (pk_buckets[i].transient == true) {
+ continue;
}
+ if (pk_buckets[i].size - pk_buckets[i].head < sz + (alignment - 1)) {
+ continue;
+ }
+ bkt = &pk_buckets[i];
+ break;
}
if (bkt == nullptr) {
bkt = &pk_buckets[pk_bucket_create_inner(PK_DEFAULT_BUCKET_SIZE, false, "pk_bucket internally created")];
@@ -509,6 +515,7 @@ pk_delete_bkt(const void* ptr, size_t sz, struct pk_membucket* bkt)
#endif
size_t i;
mtx_lock(&bkt->mtx);
+ assert(bkt->allocs > 0);
assert(ptr >= bkt->raw && (char*)ptr < bkt->ptr + bkt->size && "pointer not in memory bucket range");
assert(sz > 0 && "attempted to free pointer of size 0");
#ifdef PK_MEMORY_DEBUGGER
@@ -540,6 +547,7 @@ pk_delete_bkt(const void* ptr, size_t sz, struct pk_membucket* bkt)
bkt->lastEmptyBlockIndex = 0;
bkt->blocks[0].data = bkt->ptr;
bkt->blocks[0].size = bkt->size - (sizeof(struct pk_memblock) * bkt->maxBlockCount);
+ mtx_unlock(&bkt->mtx);
return;
}
char* afterPtr = ((char*)(ptr))+sz;