From 701db4d98d8ce2a9060b2c991a0d0da2104e8f8d Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Sat, 27 Sep 2025 23:41:15 +0800 Subject: [PATCH] update chunk-nm --- ECSMemoryPool/ecs_memorypool.cpp | 56 +------------------------------- ECSMemoryPool/ecs_memorypool.h | 28 +++------------- ECSMemoryPool/memory_pages.cpp | 48 +++++++++++++-------------- ECSMemoryPool/memory_pages.h | 24 +++++++------- 4 files changed, 42 insertions(+), 114 deletions(-) diff --git a/ECSMemoryPool/ecs_memorypool.cpp b/ECSMemoryPool/ecs_memorypool.cpp index 4a17856..cf439b2 100644 --- a/ECSMemoryPool/ecs_memorypool.cpp +++ b/ECSMemoryPool/ecs_memorypool.cpp @@ -2,58 +2,4 @@ ECSMemoryPool::ECSMemoryPool() { -} - -ChunkAccessIndex::ChunkAccessIndex(ElementControlBlock* ecb, uint64_t chunk_type_code) -:_element_bind(MemoryChunk(ecb)), _chunk_type_code(chunk_type_code) -{ - -} - -ChunkAccessIndex::ChunkAccessIndex(const ChunkAccessIndex& other) :_element_bind(other._element_bind), -_chunk_type_code(other._chunk_type_code), -_member_offset(other._member_offset) -{ - -} - -uint64_t ChunkAccessIndex::chunkType() const -{ - return _chunk_type_code; -} - -uint16_t ChunkAccessIndex::chunkSize() const -{ - return _element_bind.typeSize(); -} - -bool ChunkAccessIndex::contains(uint64_t type_code) -{ - return _member_offset.find(type_code) != _member_offset.cend(); -} - -int8_t ChunkAccessIndex::setMember(uint64_t type_code, uint16_t offset, uint16_t size) -{ - if (_element_bind.typeSize() <= offset + size) { - return -1; - } - - _member_offset[type_code] = std::make_pair(offset, size); - return 0; -} - -unsigned char* ChunkAccessIndex::getLockedDataPtr(uint64_t type_code) -{ - auto index_offset = _member_offset.find(type_code); - if (index_offset == _member_offset.cend()) - return nullptr; - - auto raw_ptr = _element_bind.dataLock(); - auto data_target_ptr = raw_ptr + index_offset->first; - return data_target_ptr; -} - -void ChunkAccessIndex::releaseData() -{ - _element_bind.release(); -} +} \ No newline at end of file diff --git a/ECSMemoryPool/ecs_memorypool.h b/ECSMemoryPool/ecs_memorypool.h index 3f13cc4..30b2260 100644 --- a/ECSMemoryPool/ecs_memorypool.h +++ b/ECSMemoryPool/ecs_memorypool.h @@ -21,7 +21,7 @@ concept CompenentType = requires(T t, T other, const QJsonObject & in, QJsonObje /// template class ChunkRefer : protected MemoryChunk { public: - ChunkRefer(ElementControlBlock* data) : MemoryChunk(data) { referAdd(); } + ChunkRefer(ChunkControlBlock* data) : MemoryChunk(data) { referAdd(); } ChunkRefer(const ChunkRefer &other) :MemoryChunk(other.data_ptr) { referAdd(); } virtual ~ChunkRefer() { referSub(); } @@ -35,24 +35,6 @@ public: }; -class ECSMEMORYPOOL_EXPORT ChunkAccessIndex { -private: - MemoryChunk _element_bind; - uint64_t _chunk_type_code; - std::map> _member_offset; - -public: - ChunkAccessIndex(ElementControlBlock* ecb, uint64_t chunk_type_code); - ChunkAccessIndex(const ChunkAccessIndex& other); - - uint64_t chunkType() const; - uint16_t chunkSize() const; - bool contains(uint64_t type_code); - - int8_t setMember(uint64_t type_code, uint16_t offset, uint16_t size); - unsigned char* getLockedDataPtr(uint64_t type_code); - void releaseData(); -}; class ECSMEMORYPOOL_EXPORT ECSMemoryPool { @@ -97,18 +79,18 @@ public: std::lock_guard lockx(_pool_protected_); auto type_code = T::typeCode(); - ElementControlBlock* refer_ptr = nullptr; + ChunkControlBlock* refer_ptr = nullptr; // 获取指定类型关联的内存页 QList page_list = _storage_pages.values(type_code); // 迭代内存页集合 for (auto page_ptr : page_list) { - auto max_element_cnt = page_ptr->maxCapacity(); + auto max_chunk_cnt = page_ptr->maxCapacity(); auto active_cnt = page_ptr->getActiveCount(); // 初级校核可用数量 - if (active_cnt < max_element_cnt) { + if (active_cnt < max_chunk_cnt) { // 逐个查找数据元素 - for (auto eidx = 0; eidx < max_element_cnt; eidx++) { + for (auto eidx = 0; eidx < max_chunk_cnt; eidx++) { auto slice_ptr = page_ptr->getChunkPtr(eidx); // 访问排他 slice_ptr->page_refer->lock(); diff --git a/ECSMemoryPool/memory_pages.cpp b/ECSMemoryPool/memory_pages.cpp index 4089810..bcd37e7 100644 --- a/ECSMemoryPool/memory_pages.cpp +++ b/ECSMemoryPool/memory_pages.cpp @@ -1,23 +1,23 @@ #include "memory_pages.h" -MemoryPage::MemoryPage(uint16_t element_size, uint64_t typecode) +MemoryPage::MemoryPage(uint16_t chunk_size, uint64_t typecode) { - pcb.byte_count_per_element = element_size; + pcb.byte_count_per_chunk = chunk_size; pcb.total_buffer_size = sizeof(data_buffer); - pcb.typecode_of_element = typecode; + pcb.typecode_of_chunk = typecode; } uint16_t MemoryPage::chunkSize() const { - return pcb.byte_count_per_element - MemoryChunk::data_buffer_offset; + return pcb.byte_count_per_chunk - MemoryChunk::data_buffer_offset; } uint16_t MemoryPage::getActiveCount(uint16_t inc) const { auto data_ptr = const_cast(this); std::lock_guard g(data_ptr->pcb.access_protected); - data_ptr->pcb.active_elements_count += inc; - return data_ptr->pcb.active_elements_count; + data_ptr->pcb.active_chunks_count += inc; + return data_ptr->pcb.active_chunks_count; } void MemoryPage::accessRecord(uint64_t timepoint_usec) { @@ -39,25 +39,25 @@ std::pair MemoryPage::getRecords() const { return std::make_pair(pcb.curr_access_usec, pcb.acc_count_per_cycle); } -ElementControlBlock* MemoryPage::getChunkPtr(int index) { +ChunkControlBlock* MemoryPage::getChunkPtr(int index) { auto member_cnt = maxCapacity(); - auto element_size = chunkRawSize(); + auto chunk_size = chunkRawSize(); - ElementControlBlock* element_ptr = nullptr; + ChunkControlBlock* chunk_ptr = nullptr; if (index >= 0 && index < member_cnt) { - element_ptr = (ElementControlBlock*)(data_buffer + index * element_size); + chunk_ptr = (ChunkControlBlock*)(data_buffer + index * chunk_size); } else if (index < 0 && index >= -member_cnt) { - element_ptr = (ElementControlBlock*)(data_buffer + (member_cnt + index) * element_size); + chunk_ptr = (ChunkControlBlock*)(data_buffer + (member_cnt + index) * chunk_size); } lock(); - if (element_ptr) { - element_ptr->page_refer = this; - element_ptr->element_index = index; + if (chunk_ptr) { + chunk_ptr->page_refer = this; + chunk_ptr->chunk_index = index; } release(); - return element_ptr; + return chunk_ptr; } void MemoryPage::lock() @@ -72,17 +72,17 @@ void MemoryPage::release() { #pragma warning(pop) } -uint64_t MemoryPage::elementTypeCode() const +uint64_t MemoryPage::chunkTypeCode() const { auto data_ptr = const_cast(this); std::lock_guard g(data_ptr->pcb.access_protected); - return pcb.typecode_of_element; + return pcb.typecode_of_chunk; } uint16_t MemoryPage::chunkRawSize() const { auto data_ptr = const_cast(this); std::lock_guard g(data_ptr->pcb.access_protected); - return pcb.byte_count_per_element; + return pcb.byte_count_per_chunk; } uint16_t MemoryPage::maxCapacity() const { @@ -90,13 +90,13 @@ uint16_t MemoryPage::maxCapacity() const { return cnt / this->chunkRawSize(); } -// element ================================================================= +// chunk ================================================================= const uint32_t MemoryChunk::data_buffer_offset = MemoryChunk::validOffset(); uint32_t MemoryChunk::validOffset() { - uint32_t remains = sizeof(ElementControlBlock) % 16; - uint32_t times = sizeof(ElementControlBlock) / 16; + uint32_t remains = sizeof(ChunkControlBlock) % 16; + uint32_t times = sizeof(ChunkControlBlock) / 16; return (remains ? times + 1 : times) * 16; } @@ -108,8 +108,8 @@ uint32_t MemoryChunk::rawSize(uint32_t data_type_size) return (remains ? times + 1 : times) * 16; } -MemoryChunk::MemoryChunk(ElementControlBlock* access_bind) - : data_ptr((ElementControlBlock*)access_bind) {} +MemoryChunk::MemoryChunk(ChunkControlBlock* access_bind) + : data_ptr((ChunkControlBlock*)access_bind) {} uint16_t MemoryChunk::typeSize() const { @@ -122,7 +122,7 @@ void MemoryChunk::accessUpdate(uint64_t time_usec) data_ptr->page_refer->accessRecord(time_usec); } -bool MemoryChunk::isActived(ElementControlBlock* refer) +bool MemoryChunk::isActived(ChunkControlBlock* refer) { refer->page_refer->lock(); auto mark = refer->refer_count; diff --git a/ECSMemoryPool/memory_pages.h b/ECSMemoryPool/memory_pages.h index 9061ec4..54bf603 100644 --- a/ECSMemoryPool/memory_pages.h +++ b/ECSMemoryPool/memory_pages.h @@ -8,11 +8,11 @@ class MemoryPage; /// 内存页访问控制块 /// struct PageControlBlock { - uint16_t active_elements_count = 0; // 活跃element数量,决定是否需要卸载 - uint16_t byte_count_per_element = 32; // 单个element大小,16的倍数,带ElementControlBlock + uint16_t active_chunks_count = 0; // 活跃chunk数量,决定是否需要卸载 + uint16_t byte_count_per_chunk = 32; // 单个chunk大小,16的倍数,带chunkControlBlock uint32_t total_buffer_size = 0; // 可用数据缓冲区大小 - uint64_t typecode_of_element = 0; // 元素类型标识码 + uint64_t typecode_of_chunk = 0; // 元素类型标识码 uint64_t curr_access_usec = 0; // 最近访问时间点,lsb:us @@ -25,9 +25,9 @@ struct PageControlBlock { /// /// 元素访问控制块 /// -struct ElementControlBlock { +struct ChunkControlBlock { uint32_t refer_count = 0; // 外部元素的引用数量,活跃标志 - uint16_t element_index = 0; // 本元素在Page中的索引 + uint16_t chunk_index = 0; // 本元素在Page中的索引 uint16_t backup_1 = 0; MemoryPage* page_refer = nullptr; // 页面关联指针 @@ -48,7 +48,7 @@ public: /// /// 构建内存页 /// - /// 原始element尺寸 + /// 原始chunk尺寸 explicit MemoryPage(uint16_t raw_esize_16B, uint64_t typecode); /// @@ -90,17 +90,17 @@ public: void release(); /// - /// 获取element元素数据访问指针 + /// 获取chunk元素数据访问指针 /// /// 元素索引 /// 是否设置 /// 数据指针 - ElementControlBlock* getChunkPtr(int index); + ChunkControlBlock* getChunkPtr(int index); /// /// 元素类型码 /// /// - uint64_t elementTypeCode() const; + uint64_t chunkTypeCode() const; /// /// 获取单个元素尺寸 /// @@ -118,7 +118,7 @@ public: /// class ECSMEMORYPOOL_EXPORT MemoryChunk { protected: - ElementControlBlock* const data_ptr; + ChunkControlBlock* const data_ptr; public: static const uint32_t data_buffer_offset; @@ -128,13 +128,13 @@ public: /// 数据活跃状态 /// /// - static bool isActived(ElementControlBlock* refer); + static bool isActived(ChunkControlBlock* refer); /// /// 构建内存元素访问接口 /// /// - MemoryChunk(ElementControlBlock* access_bind); + MemoryChunk(ChunkControlBlock* access_bind); /// /// 提取关联元素尺寸