From 8629b2497b7cb453d1e4a3ed6897cfaf8a771863 Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Wed, 6 Dec 2023 15:27:42 -0500 Subject: expose if the contents of a bucket were moved --- src/asset-manager.cpp | 3 ++- src/ecs.cpp | 9 ++++++--- src/memory.cpp | 4 +++- src/memory.hpp | 10 +++++----- src/thread_pool.cpp | 3 ++- 5 files changed, 18 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/asset-manager.cpp b/src/asset-manager.cpp index 5ff25f3..d6a14a4 100644 --- a/src/asset-manager.cpp +++ b/src/asset-manager.cpp @@ -16,7 +16,8 @@ void AM_Init() { } AssetHandle AM_Register_Inner(const void *src, void *dst, int64_t size, const char *key) { - AssetHandle_T assetHandle_T{Buckets_NewHandle(maxAssetItemsPerBucket, Asset_BucketContainer)}; + bool moved = false; + AssetHandle_T assetHandle_T{Buckets_NewHandle(maxAssetItemsPerBucket, Asset_BucketContainer, moved)}; if (src != nullptr) { std::memcpy(dst, src, size); diff --git a/src/ecs.cpp b/src/ecs.cpp index c892f84..6556bd2 100644 --- a/src/ecs.cpp +++ b/src/ecs.cpp @@ -76,7 +76,8 @@ Entity *ECS_GetEntities(uint64_t bucketIndex, uint64_t &itemCount) { } EntityHandle ECS_CreateEntity_Inner(EntityHandle parentEntHandle) { - EntityHandle_T entityHandle_T{Buckets_NewHandle(maxBucketItemCount, Entities_BucketContainer)}; + bool moved; + EntityHandle_T entityHandle_T{Buckets_NewHandle(maxBucketItemCount, Entities_BucketContainer, moved)}; EntityHandle entityHandle{entityHandle_T}; auto b = Buckets_GetBucketIndex(static_cast(entityHandle)); @@ -353,7 +354,8 @@ CompGrBinds &ECS_CreateGrBinds(EntityHandle entHandle) { assert(ent->grBindsHandle == GrBindsHandle_MAX); - GrBindsHandle_T newHandle{Buckets_NewHandle(maxBucketItemCount, Comp_GrBinds_BucketContainer)}; + bool moved; + GrBindsHandle_T newHandle{Buckets_NewHandle(maxBucketItemCount, Comp_GrBinds_BucketContainer, moved)}; ent->grBindsHandle = GrBindsHandle{newHandle}; auto b = Buckets_GetBucketIndex(newHandle); auto i = Buckets_GetItemIndex(newHandle); @@ -406,7 +408,8 @@ CompInstance &ECS_CreateInstance(EntityHandle entHandle, EntityHandle entityType assert(ent->grBindsHandle == GrBindsHandle_MAX); assert(entTypeEnt->grBindsHandle != GrBindsHandle_MAX); - InstanceHandle_T newHandle{Buckets_NewHandle(maxBucketItemCount, Comp_Instance_BucketContainer)}; + bool moved; + InstanceHandle_T newHandle{Buckets_NewHandle(maxBucketItemCount, Comp_Instance_BucketContainer, moved)}; ent->instanceHandle = InstanceHandle{newHandle}; GrBindsHandle_T grBindsHandle_t{static_cast(entTypeEnt->grBindsHandle)}; diff --git a/src/memory.cpp b/src/memory.cpp index f2b2ee3..9d235db 100644 --- a/src/memory.cpp +++ b/src/memory.cpp @@ -344,7 +344,8 @@ void Pke_MemoryFlush() { } } -uint64_t Buckets_NewHandle(std::size_t bucketBytes, std::size_t alignment, uint64_t bucketItemCount, uint64_t &bucketIncrementer, uint64_t &bucketCounter, uint64_t &itemCounter, void*& buckets) { +uint64_t Buckets_NewHandle(std::size_t bucketBytes, std::size_t alignment, uint64_t bucketItemCount, uint64_t &bucketIncrementer, uint64_t &bucketCounter, uint64_t &itemCounter, void*& buckets, bool &moved) { + moved = false; uint64_t newHandle{itemCounter | bucketCounter}; std::size_t calculatedAlignment = alignment < MINIMUM_ALIGNMENT ? MINIMUM_ALIGNMENT : alignment; @@ -355,6 +356,7 @@ uint64_t Buckets_NewHandle(std::size_t bucketBytes, std::size_t alignment, uint6 bucketCounter += 1; } if (bucketCounter > bucketIncrementer) { + moved = true; int64_t newIncrement = bucketIncrementer * 1.5; char * newBuckets = reinterpret_cast(Pke_New(bucketBytes * newIncrement, calculatedAlignment)); std::memcpy(newBuckets, buckets, bucketBytes * bucketIncrementer); diff --git a/src/memory.hpp b/src/memory.hpp index 0512118..339d972 100644 --- a/src/memory.hpp +++ b/src/memory.hpp @@ -96,18 +96,18 @@ void Buckets_Init(BucketContainer &bktContainer) { bktContainer.buckets = Pke_New(bktContainer.incrementer); } -uint64_t Buckets_NewHandle(std::size_t bucketBytes, std::size_t alignment, uint64_t bucketItemCount, uint64_t &bucketIncrementer, uint64_t &bucketCounter, uint64_t &itemCounter, void*& buckets); +uint64_t Buckets_NewHandle(std::size_t bucketBytes, std::size_t alignment, uint64_t bucketItemCount, uint64_t &bucketIncrementer, uint64_t &bucketCounter, uint64_t &itemCounter, void*& buckets, bool &moved); -template inline uint64_t Buckets_NewHandle(uint64_t bucketItemCount, uint64_t &bucketIncrementer, uint64_t &bucketCounter, uint64_t &itemCounter, T*& buckets) { +template inline uint64_t Buckets_NewHandle(uint64_t bucketItemCount, uint64_t &bucketIncrementer, uint64_t &bucketCounter, uint64_t &itemCounter, T*& buckets, bool &moved) { void *ptr = reinterpret_cast(buckets); - uint64_t handle = Buckets_NewHandle(sizeof(T), alignof(T), bucketItemCount, bucketIncrementer, bucketCounter, itemCounter, ptr); + uint64_t handle = Buckets_NewHandle(sizeof(T), alignof(T), bucketItemCount, bucketIncrementer, bucketCounter, itemCounter, ptr, moved); buckets = reinterpret_cast(ptr); return handle; } template -inline CT Buckets_NewHandle(uint64_t maxBucketItemCount, BucketContainer &bktContainer) { - return Buckets_NewHandle(maxBucketItemCount, bktContainer.incrementer, bktContainer.bucketCounter, bktContainer.itemCounter, bktContainer.buckets); +inline CT Buckets_NewHandle(uint64_t maxBucketItemCount, BucketContainer &bktContainer, bool &moved) { + return Buckets_NewHandle(maxBucketItemCount, bktContainer.incrementer, bktContainer.bucketCounter, bktContainer.itemCounter, bktContainer.buckets, moved); } static inline constexpr uint64_t Buckets_GetBucketIndex(uint64_t handle) { diff --git a/src/thread_pool.cpp b/src/thread_pool.cpp index d3073dc..15cc4e9 100644 --- a/src/thread_pool.cpp +++ b/src/thread_pool.cpp @@ -117,7 +117,8 @@ ThreadPoolHandle PkeThreads_Init(uint8_t threadCount, uint8_t maxQueueCount, Mem Buckets_Init(ThreadPool_BucketContainer); } assert(threadCount > 0); - ThreadPoolHandle_T newHandle{Buckets_NewHandle(255, ThreadPool_BucketContainer)}; + bool moved; + ThreadPoolHandle_T newHandle{Buckets_NewHandle(255, ThreadPool_BucketContainer, moved)}; auto b = Buckets_GetBucketIndex(newHandle); auto i = Buckets_GetItemIndex(newHandle); -- cgit v1.2.3