From 1d3bfd616e1b00c0510d9ac00e6e9ee6b6daab83 Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Tue, 8 Aug 2023 21:30:19 -0400 Subject: memory cleanup and require size for deleting the pointer --- src/memory.cpp | 41 ++++++++++++++++++----------------------- src/memory.hpp | 18 +++++++++++++----- src/window.cpp | 8 ++++---- 3 files changed, 35 insertions(+), 32 deletions(-) (limited to 'src') 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(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) { diff --git a/src/memory.hpp b/src/memory.hpp index 43ada0f..fe93cc7 100644 --- a/src/memory.hpp +++ b/src/memory.hpp @@ -14,19 +14,27 @@ struct MemBucket; void *PkeNew(std::size_t sz); void *PkeNew(std::size_t sz, MemBucket *bkt); -void PkeDelete(void *ptr); -void PkeDelete(void *ptr, MemBucket *bkt); +void PkeDelete(const void *ptr, std::size_t sz); +void PkeDelete(const void *ptr, std::size_t sz, MemBucket *bkt); MemBucket *BeginTransientBucket(int64_t sz = DEFAULT_BUCKET_SIZE); // 256MB void EndTransientBucket(MemBucket *bkt); template -T *PkeNew() { +inline T *PkeNew() { return reinterpret_cast(PkeNew(sizeof(T))); } template -T *PkeNew(std::size_t sz) { - return reinterpret_cast(PkeNew(sz)); +inline T *PkeNew(long count) { + return reinterpret_cast(PkeNew(sizeof(T) * count)); +} +template +inline void PkeDelete(const void *ptr) { + return PkeDelete(ptr, sizeof(T)); +} +template +inline void PkeDelete(const void *ptr, long count) { + return PkeDelete(ptr, sizeof(T) * count); } } /* pke */ diff --git a/src/window.cpp b/src/window.cpp index ef65c5d..0c4d316 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -346,7 +346,7 @@ void CreateSwapchain() { break; } - pke::PkeDelete(surfaceFormats); + pke::PkeDelete(surfaceFormats, surfaceFormatCounts); } int width, height; @@ -375,7 +375,7 @@ void CreateSwapchain() { } selectedPresentIndex = mailboxIndex != -1ul ? mailboxIndex : fifoRelaxedIndex; vkPresentModeKHR = presentModes[selectedPresentIndex]; - pke::PkeDelete(presentModes); + pke::PkeDelete(presentModes, presentModeCount); } VkSwapchainCreateInfoKHR vkSwapchainCreateInfo{}; @@ -441,8 +441,8 @@ void DestroySwapchain() { for (long i = 0; i < swapchainLength; ++i) { vkDestroyImageView(vkDevice, swapchainImageViews[i], vkAllocator); } - pke::PkeDelete(swapchainImageViews); - pke::PkeDelete(swapchainImages); + pke::PkeDelete(swapchainImageViews, swapchainLength); + pke::PkeDelete(swapchainImages, swapchainLength); } vkDestroySwapchainKHR(vkDevice, vkSwapchainKHR, vkAllocator); swapchainImages = reinterpret_cast(0xCAFEBABE); -- cgit v1.2.3