Files
fxalloc/headers/_FXAlloc.h
T
2026-05-07 10:02:18 +05:00

84 lines
2.6 KiB
C

#pragma once
#include "FXAlloc.h"
#ifdef _WIN32
typedef HANDLE fxsync_t;
#else
typedef pthread_mutex_t fxsync_t;
#endif
#if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 201112L)
#error "C11 standard is required for _Atomic support"
#endif
#if defined(__clang__)
// Clang: _Atomic поддерживается в C11 во всех актуальных версиях
#elif defined(__GNUC__)
#if (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 9)
#error "GCC < 4.9 does not support _Atomic (C11)"
#endif
#elif defined(_MSC_VER)
#if _MSC_VER < 1930 // VS 2022+ (_MSC_VER >= 1930)
#error "MSVC < VS 2022 (_MSC_VER < 1930) does not support _Atomic (C11)"
#endif
#else
#error "Unsupported compiler. Only Clang, GCC >=4.9, and MSVC VS 2022+ support _Atomic in C11"
#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; ///< Список аллоцированных блоков
uint32_t ntotal; ///< Блоков всего
uint32_t nbusy; ///< Блоков занято
uint32_t nalloc; ///< Блоков алоцировано через `malloc`
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;