145 lines
3.3 KiB
C
145 lines
3.3 KiB
C
|
|
#pragma once
|
|||
|
|
#include <mutex>
|
|||
|
|
|
|||
|
|
class MemoryPage;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ڴ<EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD>ʿ<EFBFBD><CABF>ƿ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
struct PageControlBlock {
|
|||
|
|
uint16_t active_entities_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>
|
|||
|
|
uint32_t total_buffer_size = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
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
|
|||
|
|
uint32_t acc_count_per_cycle = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD>ʴ<EFBFBD><CAB4><EFBFBD>
|
|||
|
|
uint32_t un_used = 0;
|
|||
|
|
|
|||
|
|
std::mutex access_protected; // <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
};
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ڴ<EFBFBD>ҳ<EFBFBD><D2B3>16K<36><4B>С
|
|||
|
|
/// </summary>
|
|||
|
|
class MemoryPage {
|
|||
|
|
private:
|
|||
|
|
PageControlBlock pcb;
|
|||
|
|
char data_buffer[16 * 1024 - (sizeof(PageControlBlock) / 8 + 1) * 8] = {};
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ҳ
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="raw_element_size_16B">ԭʼelement<6E>ߴ<EFBFBD></param>
|
|||
|
|
explicit MemoryPage(uint16_t raw_element_size_16B, uint64_t typecode);
|
|||
|
|
|
|||
|
|
/// <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>
|
|||
|
|
char* getElementPtr(int index);
|
|||
|
|
/// <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>
|
|||
|
|
uint16_t elementSize() const;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡԪ<C8A1><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
uint16_t elementCount() const;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Ԫ<>ط<EFBFBD><D8B7>ʿ<EFBFBD><CABF>ƿ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
struct ElementControlBlock {
|
|||
|
|
uint8_t active_mark = 0; // <20><>Ծ<EFBFBD><D4BE>־
|
|||
|
|
uint8_t backup_1 = 0;
|
|||
|
|
uint16_t byte_count = 16; // <20><>Ԫ<EFBFBD><D4AA><EFBFBD>ֽڳ<D6BD><DAB3>ȣ<EFBFBD>16<31>ı<EFBFBD><C4B1><EFBFBD>
|
|||
|
|
uint16_t element_index = 0; // <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>Page<67>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint16_t backup_2 = 0;
|
|||
|
|
MemoryPage* page_refer = nullptr; // ҳ<><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
void* extend_bind = nullptr; // <20><EFBFBD><F3B6A8BF>ƿ<EFBFBD><C6BF>ڴ<EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ڴ<EFBFBD>Ԫ<EFBFBD>ط<EFBFBD><D8B7>ʽӿ<CABD>
|
|||
|
|
/// </summary>
|
|||
|
|
class MemoryElement {
|
|||
|
|
private:
|
|||
|
|
ElementControlBlock* const data_ptr;
|
|||
|
|
uint32_t buffer_offset = 0;
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
static uint32_t validOffset();
|
|||
|
|
static uint32_t rawSize(uint32_t data_type_size);
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>Ԫ<EFBFBD>ط<EFBFBD><D8B7>ʽӿ<CABD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="access_bind"></param>
|
|||
|
|
MemoryElement(char* access_bind);
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="time_usec"></param>
|
|||
|
|
void accessRecUpdate(uint64_t time_usec);
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>ݻ<EFBFBD>Ծ״̬
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
uint8_t isActived() const;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD>Ծ״̬
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="ste"></param>
|
|||
|
|
void setActive(uint8_t ste);
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ洢<DDB4>ڴ<EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
char* dataLock();
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
void release();
|
|||
|
|
};
|