diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-02-19 17:18:45 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-02-19 17:18:45 -0500 |
| commit | ea5dfe4a613937dd4ac950fe2df45a4a10a5ea18 (patch) | |
| tree | fd25ebb912f932afe67d58398ddc4815bbe94f77 | |
| parent | 5b50b5b6dcee28625e91ed1b5f2a938e1ca3f54c (diff) | |
pkmem: pk_delete_bkt unlock mtx on early exit
| -rw-r--r-- | pkmem.h | 16 |
1 files changed, 12 insertions, 4 deletions
@@ -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; |
