#pragma once #include "FXAlloc.h" #ifdef _WIN32 typedef HANDLE fxsync_t; #else typedef pthread_mutex_t fxsync_t; #endif typedef struct FXMemoryBlock FXMemoryBlock; #pragma pack(push, 8) /** * @brief Метаданные отдельного блока памяти * */ typedef struct FXMemoryBlock { FXMemoryBlock* next; ///< Следующий в стэке свободных FXMemoryBlock* list; ///< Следующий в списке алоцированных uint32_t thread_idx; ///< Индекс потока uint32_t grade_idx; ///< Индекс грейда uint32_t used; ///< Использовано байт uint32_t padding; ///< Это ненужные байты, во всяком случае - пока uint8_t data[]; ///< Пользовательские данные } FXMemoryBlock; #pragma pack(push, 16) /** * @brief Пул выделяемый для отдельно взятого потока */ typedef struct FXGradePool { FXMemoryBlock* prealloced; FXMemoryBlock* lifo; FXMemoryBlock* list_first; FXMemoryBlock* list_last; uint32_t ntotal; uint32_t nbusy; uint32_t nalloc; uint32_t nprealloc; } FXGradePool; #pragma pack(push, 8) /** * @brief Thread memory pool * */ typedef struct FXThreadPool { uint32_t isActive; uint32_t ngrades; FXGradePool grades[]; } FXThreadPool; #pragma pack(pop) typedef struct FXGlobalMemoryPool { FXThreadPool** pools; fxsync_t mutex; } FXGlobalMemoryPool;