Работа с интерфейсом аллокатора
This commit is contained in:
@@ -2,69 +2,60 @@
|
||||
|
||||
#include "FXAlloc.h"
|
||||
|
||||
#include "mword.h"
|
||||
#ifdef _WIN32
|
||||
typedef HANDLE fxsync_t;
|
||||
#else
|
||||
typedef pthread_mutex_t fxsync_t;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct FXMemoryBlock FXMemoryBlock;
|
||||
|
||||
/**
|
||||
* @brief Минимальная структурная единица - блок памяти
|
||||
* В памяти расположены друг за другом с гарантированным выравниванием по void*
|
||||
* Клиентский указатель указывает непосредственно за структуру
|
||||
* fxalloc() → return (void*)(block + 1);
|
||||
* fxfree() → FXMemoryBlock* block = (FXMemoryBlock*)_Ptr - 1;
|
||||
* @property next: FXMemoryBlock* - Указатель на следующий свободный блок
|
||||
* @property Индекс потока в глобальном пуле
|
||||
* @property Индекс грейда в пуле конкретного потока
|
||||
* */
|
||||
struct FXMemoryBlock {
|
||||
/// @brief Указатель на следующий свободный блок
|
||||
FXMemoryBlock* next;
|
||||
/// @brief Индекс потока в глобальном пуле
|
||||
umword_t tid;
|
||||
/// @brief Индекс грейда в пуле конкретного потока
|
||||
umword_t gid;
|
||||
};
|
||||
#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)
|
||||
|
||||
struct FXMemoryBlock {
|
||||
/// @brief Указатель на следующий свободный блок
|
||||
FXMemoryBlock* next;
|
||||
/// @brief Индекс потока в глобальном пуле
|
||||
uint32_t tid;
|
||||
/// @brief Индекс грейда в пуле конкретного потока
|
||||
uint32_t gid;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Минимальная структурная единица - блок памяти
|
||||
* В памяти расположены друг за другом с гарантированным выравниванием по void*
|
||||
* Клиентский указатель указывает непосредственно за структуру
|
||||
* fxalloc() → return (void*)(block + 1);
|
||||
* fxfree() → FXMemoryBlock* block = (FXMemoryBlock*)_Ptr - 1;
|
||||
* @property next: FXMemoryBlock* - Указатель на следующий свободный блок
|
||||
* @property Индекс потока в глобальном пуле
|
||||
* @property Индекс грейда в пуле конкретного потока
|
||||
* */
|
||||
struct FXMemoryBlock {
|
||||
/// @brief Указатель на следующий свободный блок
|
||||
FXMemoryBlock* next;
|
||||
/// @brief Полезные данные в блоке
|
||||
uint32_t used;
|
||||
/// @brief Индекс потока в глобальном пуле
|
||||
uint16_t tid;
|
||||
/// @brief Индекс грейда в пуле конкретного потока
|
||||
uint16_t gid;
|
||||
};
|
||||
* @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;
|
||||
|
||||
/// @brief Группа блоков одной градации
|
||||
typedef struct FXGradedMemoryPool {
|
||||
/// @brief Указатель на последний свободный блок
|
||||
FXMemoryBlock* free;
|
||||
/// @brief Всего блоков в данной группе
|
||||
umword_t total;
|
||||
/// @brief Количество преаллоцированных блоков
|
||||
umword_t count_pre;
|
||||
/// @brief Количество используемых блоков
|
||||
mword_t used;
|
||||
/// @brief Количество свободных блоков
|
||||
mword_t free;
|
||||
} FXMemoryPoolGrade;
|
||||
#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;
|
||||
Reference in New Issue
Block a user