Работа с интерфейсом аллокатора

This commit is contained in:
2026-05-07 03:46:44 +05:00
parent b9c2a05010
commit 55fd3c640b
7 changed files with 174 additions and 206 deletions
+10 -5
View File
@@ -3,9 +3,11 @@
* @file neurox/ccpp/fxalloc/includes/FXAlloc.h
* @author felex67 (admin@felexdev.ru)
* @version 1.0.0 dev-in-progress
* @brief Публичный интерфейс модуля-аллокатора fxalloc(includes/FXAlloc.h)
*
* @brief Публичный интерфейс модуля аллокатора-профилировщика
*
* @details Language: C11 (ISO/IEC 9899:2011).
*
* Теоретический маскимальный размер блока `(1 << 32) - 25 = 4 294 967 271 байт`
*
* При первом вызове `fxalloc()` до `fxalloc_init()` в глобальной облачти будет
@@ -42,14 +44,17 @@
* */
#include <stdint.h>
#ifdef _WIN32 // Windows
#include <Windows.h>
#ifdef _WIN32
// Windows
#include <windows.h>
#define thread_local __declspec(thread)
#else // Linux
#include <threads.h>
#else
// Linux
#include <pthread.h>
#define thread_local __thread
#endif //_WIN32
#ifdef __cplusplus
extern "C" {
#endif //__cplusplus
-49
View File
@@ -1,49 +0,0 @@
#ifndef FX_MEMORY_BLOCK_H
#define FX_MEMORY_BLOCK_H
#include <stdint.h>
#include "mword.h"
// Определяем оптимальный тип метаданных для FXMemoryBlock
#if defined(__x86_64__) || defined(_M_X64) || \
defined(__amd64__) || defined(__amd64) || \
defined(__aarch64__) || defined(_M_ARM64) || \
defined(__AARCH64__) || defined(__powerpc64__) || \
defined(__ppc64__)
// Для 64-битных архитектур используем uint32_t
// для оптимального баланса между размером и производительностью
typedef uint32_t fxmbmeta_t;
#elif defined(__i386__) || defined(_M_IX86) || \
defined(__i486__) || defined(__i586__) || \
defined(__i686__) || defined(__arm__) || \
defined(_M_ARM) || defined(__ARM_ARCH_7__) || \
defined(__ARM_ARCH_8__) || defined(__powerpc__) || \
defined(__ppc__)
// Для 32-битных архитектур используем uint32_t
typedef uint32_t fxmbmeta_t;
#elif defined(__riscv)
#if __riscv_xlen == 64
typedef uint32_t fxmbmeta_t;
#elif __riscv_xlen == 32
typedef uint32_t fxmbmeta_t;
#else
#error "Unsupported RISC-V word size: __riscv_xlen must be 32 or 64"
#endif
#else
// Резервный вариант: определяем по размеру указателя
#if sizeof(void*) == 8
typedef uint32_t fxmbmeta_t;
#elif sizeof(void*) == 4
typedef uint32_t fxmbmeta_t;
#else
#error "Unsupported pointer size"
#endif
#endif
// Проверка корректности определения типа
static_assert(sizeof(fxmbmeta_t) == 4, "fxmbmeta_t must be 32-bit");
#endif // FX_MEMORY_BLOCK_H
-74
View File
@@ -1,74 +0,0 @@
#pragma once
#include <stdint.h>
#if defined(__x86_64__) || defined(_M_X64) || \
defined(__amd64__) || defined(__amd64)
// x64: 64-битное машинное слово
typedef int64_t mword_t;
typedef uint64_t umword_t;
#elif defined(__i386__) || defined(_M_IX86) || \
defined(__i486__) || defined(__i586__) || \
defined(__i686__)
// x86: 32-битное машинное слово
typedef int32_t mword_t;
typedef uint32_t umword_t;
#elif defined(__aarch64__) || defined(_M_ARM64) || defined(__AARCH64__)
// ARM64: 64-битное машинное слово
typedef int64_t mword_t;
typedef uint64_t umword_t;
#elif defined(__arm__) || defined(_M_ARM) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_8__)
// ARM32: 32-битное машинное слово
typedef int32_t mword_t;
typedef uint32_t umword_t;
#elif defined(__riscv) && defined(__riscv_xlen)
#if __riscv_xlen == 64
// RISCV 64: 64-битное машинное слово
typedef int64_t mword_t;
typedef uint64_t umword_t;
#elif __riscv_xlen == 32
// RISCV 32: 32-битное машинное слово
typedef int32_t mword_t;
typedef uint32_t umword_t;
#else
#error "Unsupported RISC-V word size: __riscv_xlen must be 32 or 64"
#endif
#elif defined(__powerpc64__) || defined(__ppc64__)
// PowerPC64: 64-битное машинное слово
typedef int64_t mword_t;
typedef uint64_t umword_t;
#elif defined(__powerpc__) || defined(__ppc__)
// PowerPC32: 32-битное машинное слово
typedef int32_t mword_t;
typedef uint32_t umword_t;
#else
// Резервный вариант: определяем по диапазону unsigned long
#include <limits.h>
#if ULONG_MAX == 18446744073709551615ULL // 2^64 - 1
typedef int64_t mword_t;
typedef uint64_t umword_t;
#elif ULONG_MAX == 4294967295UL // 2^32 - 1
typedef int32_t mword_t;
typedef uint32_t umword_t;
#elif ULONG_MAX == 65535U // 2^16 - 1
typedef int16_t mword_t;
typedef uint16_t umword_t;
#else
#error "Cannot determine machine word size: unsupported ULONG_MAX"
#endif
#endif
/* Проверки добавлены по настоянию YandexGPT 5.1 Pro(АлисаAI) */
// Статическая проверка: размер слова — степень двойки
static_assert((sizeof(mword_t) & (sizeof(mword_t) - 1)) == 0, "Machine word size must be a power of two");
// Статическая проверка: signed и unsigned версии имеют одинаковый размер
static_assert(sizeof(mword_t) == sizeof(umword_t), "mword_t and umword_t must have the same size");