Files
fxalloc/headers/_FXAlloc.h
T

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;