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 12:06:00 +00:00
|
|
|
|
|
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 12:06:00 +00:00
|
|
|
|
|
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>
|
2025-09-11 12:06:00 +00:00
|
|
|
|
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>
|
|
|
|
|
|
};
|
2025-09-11 12:06:00 +00:00
|
|
|
|
|
|
|
|
|
|
/// <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>־
|
2025-09-11 12:06:00 +00:00
|
|
|
|
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;
|
2025-09-11 12:06:00 +00:00
|
|
|
|
|
|
|
|
|
|
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;
|
2025-09-11 12:06:00 +00:00
|
|
|
|
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>
|
2025-09-11 12:06:00 +00:00
|
|
|
|
/// <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>
|
2025-09-11 12:06:00 +00:00
|
|
|
|
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>
|
2025-09-11 12:06:00 +00:00
|
|
|
|
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>
|
2025-09-11 12:06:00 +00:00
|
|
|
|
unsigned char* dataLock();
|
2025-09-11 10:36:49 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
void release();
|
|
|
|
|
|
};
|