diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-08-08 21:30:19 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-08-08 21:30:19 -0400 |
| commit | 1d3bfd616e1b00c0510d9ac00e6e9ee6b6daab83 (patch) | |
| tree | 7e43796de56f19fb3d1e4eac944f403bc1bb8560 /src/memory.cpp | |
| parent | 9383af84ee02b755750bae9ce09f0de3d0d1f7c9 (diff) | |
memory cleanup and require size for deleting the pointer
Diffstat (limited to 'src/memory.cpp')
| -rw-r--r-- | src/memory.cpp | 41 |
1 files changed, 18 insertions, 23 deletions
diff --git a/src/memory.cpp b/src/memory.cpp index 83f8483..abaea00 100644 --- a/src/memory.cpp +++ b/src/memory.cpp @@ -21,6 +21,13 @@ int64_t InitNewBucket(int64_t sz) { return bucketHead++; } +void *pke::PkeNew(std::size_t sz, pke::MemBucket *bkt) { + void *ptr = bkt->ptr + bkt->head; + bkt->head += sz; + bkt->allocs++; + return ptr; +} + void *pke::PkeNew(std::size_t sz) { MemBucket *bkt = nullptr; for (long i = 0; i < bucketHead; ++i) { @@ -31,20 +38,20 @@ void *pke::PkeNew(std::size_t sz) { if (bkt == nullptr) { bkt = &buckets[InitNewBucket(DEFAULT_BUCKET_SIZE)]; } - void *ptr = bkt->ptr + bkt->head; - bkt->head += sz; - bkt->allocs++; - return ptr; + return PkeNew(sz, bkt); } -void *pke::PkeNew(std::size_t sz, pke::MemBucket *bkt) { - void *ptr = bkt->ptr + bkt->head; - bkt->head += sz; - bkt->allocs++; - return ptr; +void pke::PkeDelete(const void *ptr, std::size_t sz, pke::MemBucket *bkt) { + bkt->allocs--; + bkt->free += sz; + if (ptr == bkt->ptr + bkt->head - sz) bkt->head -= sz; + if (bkt->allocs == 0) { + bkt->head = 0; + bkt->free = 0; + } } -void pke::PkeDelete(void *ptr) { +void pke::PkeDelete(const void *ptr, std::size_t sz) { pke::MemBucket *bkt = nullptr; for (long i = 0; i < bucketHead; ++i) { bkt = &buckets[i]; @@ -54,19 +61,7 @@ void pke::PkeDelete(void *ptr) { std::printf("bad pointer %llu", reinterpret_cast<unsigned long long>(ptr)); throw "bad pointer"; } - bkt->allocs--; - if (bkt->allocs == 0) { - bkt->head = 0; - bkt->free = 0; - } -} - -void pke::PkeDelete(void *ptr, pke::MemBucket *bkt) { - bkt->allocs--; - if (bkt->allocs == 0) { - bkt->head = 0; - bkt->free = 0; - } + PkeDelete(ptr, sz, bkt); } pke::MemBucket *pke::BeginTransientBucket(int64_t sz) { |
