WsComponentPool/ECSMemoryPool/memory_pages.h

171 lines
3.9 KiB
C
Raw Normal View History

2025-09-11 10:36:49 +00:00
#pragma once
#include <mutex>
2025-09-11 22:36:56 +00:00
#include "ecsmemorypool_global.h"
2025-09-11 10:36:49 +00:00
class MemoryPage;
/// <summary>
/// <20>ڴ<EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD>ʿ<EFBFBD><CABF>ƿ<EFBFBD>
/// </summary>
struct PageControlBlock {
2025-09-11 14:01:42 +00:00
uint16_t active_elements_count = 0; // <20><>Ծelement<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫж<D2AA><D0B6>
uint16_t byte_count_per_element = 32; // <20><><EFBFBD><EFBFBD>element<6E><74>С<EFBFBD><D0A1>16<31>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ElementControlBlock
2025-09-11 10:36:49 +00:00
uint32_t total_buffer_size = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
2025-09-11 10:36:49 +00:00
uint64_t typecode_of_element = 0; // Ԫ<><D4AA><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD>ʶ<EFBFBD><CAB6>
uint64_t curr_access_usec = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>㣬lsb<73><62>us
2025-09-11 10:36:49 +00:00
uint32_t acc_count_per_cycle = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD>ʴ<EFBFBD><CAB4><EFBFBD>
uint32_t backup = 0;
2025-09-11 10:36:49 +00:00
std::mutex access_protected; // <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>
};
/// <summary>
/// Ԫ<>ط<EFBFBD><D8B7>ʿ<EFBFBD><CABF>ƿ<EFBFBD>
/// </summary>
struct ElementControlBlock {
2025-09-11 14:01:42 +00:00
uint32_t refer_count = 0; // <20>ⲿԪ<E2B2BF>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ծ<EFBFBD><D4BE>־
uint16_t element_index = 0; // <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>Page<67>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
2025-09-11 14:01:42 +00:00
uint16_t backup_1 = 0;
MemoryPage* page_refer = nullptr; // ҳ<><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
void* extend_bind = nullptr; // <20>󶨿<EFBFBD><F3B6A8BF>ƿ<EFBFBD><C6BF>ڴ<EFBFBD>ָ<EFBFBD><D6B8>
};
2025-09-11 10:36:49 +00:00
/// <summary>
/// <20>ڴ<EFBFBD>ҳ<EFBFBD><D2B3>16K<36><4B>С
/// </summary>
2025-09-11 22:36:56 +00:00
class ECSMEMORYPOOL_EXPORT MemoryPage {
2025-09-11 10:36:49 +00:00
private:
PageControlBlock pcb;
unsigned char data_buffer[16 * 1024 - (sizeof(PageControlBlock) / 8 + 1) * 8] = {};
2025-09-11 10:36:49 +00:00
public:
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ҳ
/// </summary>
/// <param name="raw_esize_16B">ԭʼelement<6E>ߴ<EFBFBD></param>
explicit MemoryPage(uint16_t raw_esize_16B, uint64_t typecode);
2025-09-11 10:36:49 +00:00
2025-09-11 14:01:42 +00:00
/// <summary>
/// <20>ڴ<EFBFBD><DAB4><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صijߴ<C4B3>
/// </summary>
/// <returns></returns>
2025-09-26 16:45:04 +00:00
uint16_t chunkSize() const;
2025-09-11 14:01:42 +00:00
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0>ԾԪ<D4BE><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="inc"><3E>仯ֵ</param>
/// <returns><3E><>ǰԪ<C7B0><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
uint16_t getActiveCount(uint16_t inc = 0) const;
2025-09-11 10:36:49 +00:00
/// <summary>
/// <20><>¼<EFBFBD><C2BC><EFBFBD>η<EFBFBD><CEB7><EFBFBD>ʱ<EFBFBD><CAB1>
/// </summary>
/// <param name="timepoint_usec"></param>
void accessRecord(uint64_t timepoint_usec);
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ<EFBFBD><CAB4><EFBFBD><EFBFBD><EFBFBD>¼
/// </summary>
/// <returns><3E><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD><EFBFBD></returns>
uint32_t timesClear();
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ʼ<EFBFBD>¼
/// </summary>
/// <returns>{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>,<2C>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD><EFBFBD>}</returns>
std::pair<uint64_t, uint32_t> getRecords() const;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>release֮ǰ<D6AE><C7B0><EFBFBD>ܷ<EFBFBD><DCB7>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κνӿڣ<D3BF><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
void lock();
/// <summary>
/// <20><><EFBFBD><EFBFBD>
/// </summary>
void release();
/// <summary>
/// <20><>ȡelementԪ<74><D4AA><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>ָ<EFBFBD><D6B8>
/// </summary>
/// <param name="index">Ԫ<><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="active_set"><3E>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8></returns>
2025-09-26 16:45:04 +00:00
ElementControlBlock* getChunkPtr(int index);
2025-09-11 10:36:49 +00:00
/// <summary>
/// Ԫ<><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
uint64_t elementTypeCode() const;
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ԫ<EFBFBD>سߴ<D8B3>
/// </summary>
/// <returns><3E>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD></returns>
2025-09-26 16:45:04 +00:00
uint16_t chunkRawSize() const;
2025-09-11 10:36:49 +00:00
/// <summary>
/// <20><>ȡԪ<C8A1><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
2025-09-26 16:45:04 +00:00
uint16_t maxChunkCapacity() const;
2025-09-11 10:36:49 +00:00
};
/// <summary>
/// <20>ڴ<EFBFBD>Ԫ<EFBFBD>ط<EFBFBD><D8B7>ʽӿ<CABD>
/// </summary>
2025-09-11 22:36:56 +00:00
class ECSMEMORYPOOL_EXPORT MemoryElement {
protected:
2025-09-11 10:36:49 +00:00
ElementControlBlock* const data_ptr;
public:
2025-09-11 14:01:42 +00:00
static const uint32_t data_buffer_offset;
2025-09-11 10:36:49 +00:00
static uint32_t validOffset();
static uint32_t rawSize(uint32_t data_type_size);
2025-09-11 22:36:56 +00:00
/// <summary>
/// <20><><EFBFBD>ݻ<EFBFBD>Ծ״̬
/// </summary>
/// <returns></returns>
static bool isActived(ElementControlBlock* refer);
2025-09-11 10:36:49 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>Ԫ<EFBFBD>ط<EFBFBD><D8B7>ʽӿ<CABD>
/// </summary>
/// <param name="access_bind"></param>
MemoryElement(ElementControlBlock* access_bind);
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ԫ<EFBFBD>سߴ<D8B3>
/// </summary>
/// <returns></returns>
2025-09-11 14:01:42 +00:00
uint16_t typeSize() const;
2025-09-11 10:36:49 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD>ʱ<EFBFBD><CAB1>
/// </summary>
/// <param name="time_usec"></param>
void accessUpdate(uint64_t time_usec);
2025-09-11 10:36:49 +00:00
2025-09-11 14:01:42 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD>Ծ״̬
/// </summary>
/// <param name="ste"></param>
void referAdd();
2025-09-11 10:36:49 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD>Ծ״̬
/// </summary>
/// <param name="ste"></param>
2025-09-11 14:01:42 +00:00
void referSub();
2025-09-11 10:36:49 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ洢<DDB4>ڴ<EFBFBD>ָ<EFBFBD><D6B8>
/// </summary>
/// <returns></returns>
unsigned char* dataLock();
2025-09-11 10:36:49 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
void release();
};