61 lines
1.6 KiB
C
61 lines
1.6 KiB
C
#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; |