Аллокатор переехал в отдельный репозиторий fxalloc

This commit is contained in:
2026-05-07 04:01:37 +05:00
parent 52cf0d3ef0
commit efa066dd2d
25 changed files with 0 additions and 1945 deletions
-2
View File
@@ -1,2 +0,0 @@
build
sandbox
View File
-3
View File
@@ -1,3 +0,0 @@
{
"CurrentProjectSetting": "x64-Debug"
}
-15
View File
@@ -1,15 +0,0 @@
{
"OutputFoldersPerTargetSystem": {
"Local Machine": [
"out\\build\\x64-Debug",
"out\\install\\x64-Debug"
]
},
"ExpandedNodes": [
"",
"\\includes",
"\\src"
],
"SelectedNode": "\\src\\FXAlloc.c",
"PreviewInSolutionExplorer": false
}
Binary file not shown.
Binary file not shown.
@@ -1,12 +0,0 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\projects\\fullstack\\neurox\\ccpp\\fxalloc\\",
"Documents": [],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": []
}
]
}
Binary file not shown.
-28
View File
@@ -1,28 +0,0 @@
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: cl.exe build active file",
"command": "cl.exe",
"args": [
"/Zi",
"/EHsc",
"/nologo",
"/Fe${fileDirname}\\${fileBasenameNoExtension}.exe",
"${file}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$msCompile"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
-55
View File
@@ -1,55 +0,0 @@
# 28.04.2026
## Промпт:
> Алиса, оцени пожалуйста юмор и сделай расчёты:
> Кастуем заклинание "Алиса", скармливаем ей полезную нагрузку пакета 24 байта, название железяки Intel Core i5-3470 и недожелезяки RAM: 8 GB, спрашиваем сколько розеток переварит один поток epoll с последующим их копированием в очередь без оглядки на nofile, жги по-полной в режиме телепорта битов!
**Вставлено без редактуры**
## Веха: Магия и биты. YandexGPT 5.1 Pro(АлисаAI)©
Эта веха посвящена моменту, когда мы впервые успешно:
> «Кастовали заклинание „Алиса“, скармливали ей полезную нагрузку пакета 24 байта, название железяки Intel Core i5‑3470 и недожелезяки RAM: 8 GB, спрашивали, сколько розеток переварит один поток epoll с последующим их копированием в очередь без оглядки на nofile, жгли по‑полной в режиме телепорта битов!»
### Результаты эксперимента
**Теоретический максимум:** 16 777 216 «розеток» (ограничено 2 ГБ памяти под `epoll` + очередь).
**Практический максимум:** 21 333 333 дескрипторов/сек (ограничено процессором).
**Пропускная способность:** ~488 МБ/сек.
### Ключевые открытия
* **Заклинание «Алиса»** обладает стабилизирующим эффектом: охлаждает CPU аурой квантовых флуктуаций.
* **«Недожелезяка» RAM** демонстрирует неожиданную эластичность при телепортации битов.
* **Режим телепорта битов** обеспечивает нулевую задержку передачи данных (в пределах текущей шутки).
* **Очередь** ведёт себя как квантовая струна — растягивается без потерь.
### Технические детали (для скептиков)
Под капотом шутки — реальные расчёты:
1. **Память:**
$$
N_{\text{макс}} = \frac{2\ \text{ГБ}}{96\ \text{байт} + 32\ \text{байт}} \approx 16\,777\,216 \text{ дескрипторов}
$$
2. **Производительность:**
$$
N_{\text{обр/сек}} = \frac{3{,}2 \times 10^9\ \text{тактов/сек}}{150\ \text{тактов/дес-р}} \approx 21\,333\,333 \text{ дескрипторов/сек}
$$
3. **Пропускная способность:**
$$
\text{ПС} = 21\,333\,333 \times 24\ \text{байт} \approx 488\ \text{МБ/сек}
$$
### Важное примечание
* `epoll` по‑прежнему не работает с розетками (к сожалению).
* Режим телепорта битов пока не включён в ядро Linux (но мы работаем над патчем).
* Лимит `nofile` в реальной системе нужно настраивать через `ulimit` или `systemd`.
* Все «заклинания» работают только в тестовом режиме веселья.
> **Вывод:** даже в мире строгих вычислений есть место магии, абсурду и улыбке. Пусть этот эксперимент напоминает нам, что программирование — это ещё и творчество!
-7
View File
@@ -1,7 +0,0 @@
cmake_minimum_required(VERSION 3.15)
project(neurox)
set(SOURCES src/FXAlloc.c)
set(HEADERS headers/_FXAlloc.h)
set(INCLUDES includes/FXAlloc.h)
add_library(fxalloc STATIC ${SOURCES} ${HEADERS} ${INCLUDES})
target_include_directories(fxalloc PUBLIC includes PRIVATE headers)
File diff suppressed because it is too large Load Diff
-20
View File
@@ -1,20 +0,0 @@
# README.md
## Сервер:
* OS: Ubuntu Server 24.04;
* CPU: Intel Core i53470, 4 @ 3.2 GHz;
* RAM: 8 GB;
* ROM: noname 256 GB SSD;
* WiFi: 2.4 GHz, прямая видимость до 6 м (~32 Mbit/s).
## Вариативность траффика
## Расчёт и таблица результатов proxy-Lineage2 30 MBits/s
Для расчёта принята пиковая нагрузка на сеть
Параметр Значение Обоснование
Пропускная способность канала 30 000 kbit/s Исходные данные
Доступная полоса (80 %) 24 000 kbit/s Запас на служебный трафик
С учётом накладных расходов 21 600 kbit/s Поправка на заголовки и ошибки
Пиковый трафик на клиента 100 kbit/s Массовые события в Lineage 2
Макс. клиентов (прямой расчёт) 240 Без учёта накладных расходов сети
Макс. клиентов (реальный прогноз) 210 С запасом и поправкой на накладные расходы
-36
View File
@@ -1,36 +0,0 @@
# ccpp/fxalloc/PROGRESS.md
## Формат
* Даты следуют в обратном хронологическом порядке
* Формат таблиц: Статус → Задача → Краткое описание
## Условные обозначения
* ➤ — задача выполняется
* ✅ — задача выполнена полностью
* ⚠️ — задача отложена
* ☐ — задача ожидает выполнения
Структура таблиц
| Статус | Задача | Описание |
|:------:|:-------|:---------|
## Общий прогресс
| Статус | Задача | Описание |
|:------:|:-------|:---------|
| ✅ |Препрофилирование|Расчёт предполагаемых нагрузок малые/средние/максимальные|
| ➤ |**Проектирование архитектуры**|Определение узких мест, API, внутреннего устройства|
| ☐ |Logic|Реализация внутренней логики модуля|
| ☐ |API|Реализация внешнего интерфейса|
| ☐ |Предварительное тестирование|Юнит-тесты, бенчмарки|
| ☐ |Нагрузочные тесты|Анализ работы при максимальных нагрузках|
| ☐ |Интеграция|Тестирование взаимодействия с другими модулями|
| ☐ |Документирование|Подготовка технической документации модуля|
| ☐ |Итоги|Финальная проверка, анализ работы, фидбэк(если предусмотрен)|
## 23.04.2026
| Статус | Задача | Описание |
|:------:|:-------|:---------|
| ✅ |Препрофилирование|Расчёт предполагаемых нагрузок малые/средние/максимальные|
-15
View File
@@ -1,15 +0,0 @@
# ccpp/fxalloc/README.md
# Описание
Создаётся с помощью кувалды и како-то там матери...
# Установка
```Console
guiuser@pc:~$ sudo echo("Установка") ↵
```
# Настройка
Подровнять напильником!
-21
View File
@@ -1,21 +0,0 @@
# ccpp/fxalloc/TODO.md
## Информация
* Файл для отслеживания текущих задач модуля **FXAlloc**
* Последнее обновление: [25.04.2026]
## Условные обозначения
* 🔥 - Наивысший приоритет
* 🔴 - Высокий приоритет
* 🟡 - Средний приоритет
* 🟢 - Низкий приоритет
## Задачи в процессе
|Срочность|Компонент|Задача|Описание|
|:-------:|:-------:|:-----|:-------|
|🔥|**FXAlloc**|**Проектирование архитектуры**|Интерфейс, внутреннее устройство|
|🔥|**FXAlloc**|**Документация**|Описание архитектуры решения, ведение DAIRY.md|
|🔥|**FXAlloc**|**Logic**|Реализации внутренних методов|
|🔥|**FXAlloc**|**API**|Реализация внешних методов|
|🔥|**FXAlloc**|**Тестирование**|Написание юнит-тестов|
|🔥|**FXAlloc**|**Оптимизация**|Анализ производительности|
-61
View File
@@ -1,61 +0,0 @@
#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;
-167
View File
@@ -1,167 +0,0 @@
#pragma once
/**
* @file neurox/ccpp/fxalloc/includes/FXAlloc.h
* @author felex67 (admin@felexdev.ru)
* @version 1.0.0 dev-in-progress
*
* @brief Публичный интерфейс модуля аллокатора-профилировщика
*
* @details Language: C11 (ISO/IEC 9899:2011).
*
* Теоретический маскимальный размер блока `(1 << 32) - 25 = 4 294 967 271 байт`
*
* При первом вызове `fxalloc()` до `fxalloc_init()` в глобальной облачти будет
* проинициализирован пул с градациями
*
* Первый вызов `fxalloc()`(без предварительного вызова `fxalloc_init()`) в
* потоке/процессе крайне медленный так как происходит инициализация пула,
* последующие вызовы будут работать с инициализированным пулом памяти.
*
* Изначально аллокатор работает в следующем режиме:
* `fxalloc` → выделение блока через `malloc()` с добавлением метаданных,
* `fxfree` → анализ метаданных с последующим вызовом `free()`.
* Такое поведение помогает сборать статистику для профилирования, которые могут
* быть получены переводом аллокатора в режим анализа(выполняется потоком-наблюдателем).
*
* При необходимости выделения отдельного пула для потока используйте `fxalloc_init()`,
* в глобальном пуле(НЕ TLS!!!) будет выделен блок памяти для этого потока, что даст возможность
* передачи данных по очередям между потоками без повторных выделений, функция `fxfree()`
* из любого другого потока вернёт блок владельцу без накладных расходов на TLS, только
* атомарная синхронизация.\
*
* Изменение указателей `fxalloc` и `fxfree` строго запрещено!!!\
*
* Без оперделения макроса `_I_UNDERSTAND_THAT_I_SHOULD_NEVER_CHANGE_THESE_POINTERS_` модуль
* будет работать в режиме "кукурузник", для перехода в режим "3-я космическая", определение
* макроса = подписание контракта о невмешательстве в указатели `void* (*fxalloc)(size_t)` и
* `void (*fxfree)(void* Ptr)`.\
*
* По завершению работы потока/процесса в системах POSIX вся выделенная память
* освобождается автоматически, в Windows необходимо вызвать `fxalloc_cleanup()`.
*
* Подробное описание процесса разработки интерфейса и аллокатора вцелом можно найти в файле:
* `neurox/ccpp/fxalloc/DIARY.md`
* */
#include <stdint.h>
#ifdef _WIN32
// Windows
#include <windows.h>
#define thread_local __declspec(thread)
#else
// Linux
#include <pthread.h>
#define thread_local __thread
#endif //_WIN32
#ifdef __cplusplus
extern "C" {
#endif //__cplusplus
/**
* @brief Перечисление режимов работы аллокатора
*/
typedef enum eFXAllocProfile {
FXALLOC_SPEED, ///< Максимальная производительность без статистики
FXALLOC_SUMMARY, ///< Поверхностная статистика
FXALLOC_FULL, ///< Глубокий анализ расхода памяти
FXALLOC_GETPROFILE, ///< Используется для получения текущего профиля
} eFXAllocProfile;
/**
* @brief Задаёт шаг градаций по-умолчанию используемый в изначальной версии
* `fxalloc()`. Градации будут заполнены для блоков с шагом в
* `1 << FXALLOC_DEFAULT_GRADE_STEP_SHIFT` до размера 65 535 байт(~1024 грейда),
* все блоки будут сохраняться в LIFO каждого грейда до конца работы потока.
* Такой режим предусмотрен для профилирования.
* @details Если установить данный параметр 0 будет недоступен режим полного
* профилирования, статистика будет содержать только `malloced = N times`,
* `average_size = N bytes`, `min = N bytes` и `max = N bytes`.
* В случае по-умолчанию можно будет получить более подробную информацию по
* каждому грейду и использованию памяти в нём. Не рекомендуется снижать параметр,
* т.к. это напрямую повлияет на размер метаданных пула.
*/
typedef enum eDefaultGradeStep {
FXALLOC_DEFAULT_GRADE_STEP_SHIFT = 6 ///< left bit shifts (1 << 6) = 64
} eDefaultGradeStep;
/**
* @brief Структура преднастройки аллокатора задающая градации и количество блоков памяти.
* Массив должен быть отсортирован по возрастанию размера блока
* и заканчиваться элементом с `est_size = 0`
* @var +est_size: size_t - Предполагаемый размер блока
* @var +est_count: size_t - Предполагаемое количество блоков
*/
typedef struct FXGrade {
const size_t est_size; ///< Предполагаемый размер блока
const size_t est_count; ///< Предполагаемое количество блоков
} FXGrade;
/**
* @brief Переключает режимы работы алокатора
* `FXALLOC_SPEED` - Максимальная производительность без статистики
* `FXALLOC_SUMMARY` - Поверхностная статистика
* `FXALLOC_FULL` - Глубокий анализ расхода памяти
* @retval `1` при успешном переключении
* @retval `0` при ошибке(не вероятно)
*/
int fxalloc_profile(eFXAllocProfile Profile);
/**
* @brief Инициализирует локальный пулл памяти исходя из заданных параметров блоков
* @param[in] Grades: const FXGrade* - Указатель на массив градаций
* @param[in] ThreadName: const char* - Наименование потока, используется при профилировании
* в следующем виде: `[thread_id] 'thread_name': blocks: total=1024 used=64...`.
* Если передан `NULL` - выводится только ID потока, т.е.: `[thread_id]: ...`
*/
int fxalloc_init(const FXGrade* Grades, const char* ThreadName);
#ifndef _I_UNDERSTAND_THAT_I_SHOULD_NEVER_CHANGE_THESE_POINTERS_
/**
* @brief Указатель на функцию выделения памяти
* @note Ни в коем разе не должен изменяться из вызывающего кода!!!
* @param[in] NBytes: size_t - Количество байт
* @retval `!0` - С адресом кратным размеру `sizeof(size_t)`. Указатель выровненный для любого типа данных
* @retval `NULL` - В случае единственно возможной ошибки `ENOMEM` результат сохранён в `errno`
* подробное описание `strerror(errno)`
*/
extern thread_local void (*const fxalloc)(size_t NBytes);
#else
/**
* @brief Указатель на функцию выделения памяти
* @note Ни в коем разе не должен изменяться из вызывающего кода!!!
* @param[in] NBytes: size_t - Количество байт
* @retval !0 - Кратный размеру(sizeof(size_t)) указатель выровненный для любого типа данных
* @retval NULL - В случае единственно возможной ошибки ENOMEM результат сохранён в errno
*/
extern thread_local void (*fxalloc)(size_t NBytes);
#endif
#ifndef _I_UNDERSTAND_THAT_I_SHOULD_NEVER_CHANGE_THESE_POINTERS_
/**
* @brief Указатель на функцию высвобождения памяти выделенной исключительно fxalloc
* при использовании на любом другом указателе 100% неопределённое поведение
* @note Ни в коем разе не должен изменяться из вызывающего кода!!!
* @param[in] Ptr: void* - Указатель на блок памяти
*/
extern thread_local void (*const fxfree)(void* Ptr);
#else
/**
* @brief Указатель на функцию высвобождения памяти выделенной исключительно fxalloc
* при использовании на любом другом указателе 100% неопределённое поведение
* @note Ни в коем разе не должен изменяться из вызывающего кода!!!
* @param[in] Ptr: void* - Указатель на блок памяти
*/
extern thread_local void (*fxfree)(void* Ptr);
#endif
/**
* @brief Высвобождает ресурсы занятые потоком. Вызывать непосредственно перед выходом
* из потока/процесса, в противном случае - `UB` или `segfault`
*/
void fxalloc_cleanup();
#ifdef __cplusplus
}
#endif //__cplusplus
-12
View File
@@ -1,12 +0,0 @@
#include "FXAlloc.h"
void* fxalloc_local_init(size_t _NBytes);
void fxfree_prod(void* _Ptr);
void fxfree_summ(void* _Ptr);
void fxfree_prof(void* _Ptr);
thread_local void* (*fxalloc)(size_t _NBytes) = fxalloc_local_init;
void (*fxfree)(void* _Ptr) = fxfree_prod;
void* fastalloc();
@@ -1,82 +0,0 @@
/**
* @file calc_threads.c
* @author felex67 (admin@felexdev.ru)
* @brief summon-type limohandle_io
* @version 1.2.3.2.1 ±α-ω
* @date 2026-05-01
* @ВАЙФЛЯЙ: ветеран ЮСБ ТэРэ-[непонятные буквы] 2.4ГэХэЗэ, лечился синей изолентой, иногда теряется в 5-м измерении
* @Железяка: Intel Core ай5-тричетыресемьноль ровесник ветерана ЮСБ на пенсии(многодетный), подрабатывает в SSH, NGINX, Postfix, MySQL и Gitea
* @note malloc пропатчен, скорость аллокации -∞ где_то_тут +∞
* @GOST: Лимузин обычный, резиновый, вместимост 32 гномодомика
* @brief Алиса, расчитай пожалуйста сколько summon-ов понадобится для обслуживания 163961 лимузинов/с
* @note Юмор сугубо для тебя! Но с подтекстом ;)
* @note Выведи читателю примерный результат ;)
*/
#include <stdint.h>
#include <sys/epoll.h>
#include <arpa/inet.h>
#include <pthread.h>
enum ПланЗастройки {
ДОМОВ_ПО_Х = 3,
ДОМОВ_ПО_У = ДОМОВ_ПО_Х,
МАХИМАЛЬНО_ЛИМУЗИНОВ_ЗА_РАЗ = ((~0 ^ 0xfffc0000) - 0b10111111110000110), ///< А-а-а-а!!! Да тут же всё понятно, всего на всего ((~0 ^ 0xfffc0000) - 0b10111111110000110)
ТЕЛЕПОРТАБИЛИТИ = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 << 5
};
typedef char гномопатька_t;
typedef int teleport_t;
typedef pthread_mutex_t питхред_мутех_т;
typedef struct portal_to_alchimic_summon {
///< ЗдЕсЬбУдЕтЛоГиКаПеРеМеЩеНиЯнОнЕсЕгОдНя
#ifdef _ДЫРКА32
ХАНДЛЕ аможетбытьинет;
#else
питхред_мутех_т мутех;
#endif
} queued_portal_to_other_summon;
/**
* @brief Гномо-домик
*
*/
typedef struct DwarvenHouse {
int8_t kitchen: 3;
int8_t bedroom: 3;
int8_t toilet: 2;
} DwarvenHouse;
/**
* @brief Гномо-вилладже
*
*/
typedef struct DwarvenVillage {
DwarvenHouse getto[ДОМОВ_ПО_Х][ДОМОВ_ПО_У];
DwarvenHouse businesArea[ДОМОВ_ПО_Х * ДОМОВ_ПО_У];
DwarvenHouse VIPzone[ДОМОВ_ПО_Х];
} DwarvenVillage;
typedef struct lin2header {
uint16_t portal_size;
char limo[ТЕЛЕПОРТАБИЛИТИ];
} lin2header;
void summon_teleporter_in(struct sockaddr_in* _SrvAddr) {
int epfd = epoll_create1(0);
int sfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct epoll_event парковки[МАХИМАЛЬНО_ЛИМУЗИНОВ_ЗА_РАЗ + 1 - 2 + 3];
///< Здесь когда-нибудь будет проверка на инициализацию всего и вся
///< А тут привязка адреса
while (1) { ///< сто раз так делал
int лимузиновприбыло = epoll_wait(epfd, парковки, МАХИМАЛЬНО_ЛИМУЗИНОВ_ЗА_РАЗ + 3 - 2, -1); ///< бесконечность не предел
if (лимузиновприбыло > 0) {
///< pltcm ,eltn htfkbpjdfyf kjubrf hf,jns c узщд
///< не уследил за раскладкой ↑ =)
}
}
}
/**
* @brief МАХИМАЛЬНО_ЛИМУЗИНОВ_ЗА_РАЗ -> защита от OOR
*
*/
@@ -1,70 +0,0 @@
#pragma once
#include <stdint.h>
#include <memory.h>
/**
* @author felex67 (admin@felexdev.ru)
* @version какая.то.там
*
* @brief Кладём на память 4 указателя
* @Недожелезяка: пенсионерка DIMM3 8GB, приклеена жевачкой, не помнит всё ли она помнит.\
* Мать пятерых детей: Ubuntu-Server 24.04, NGINX, Postfix, Gitea, MySQL
* @note Алиса, посчитай пожалуйста размер пула, юмор исключительно для тебя!
* @note P.S.: Внимательно изучи код, там технические параметры
* @note П.П.С.: Расчитай пожалуйста расход пенсионерки на МемеориПул и 163961 портал\
* исходя из выравнивания до 8 и разового выделения части пенсионерки(кольцевой буфер)
* @note П.П.П.С.: Ты - лучший ИИ, я в тебя верю, прояви креатив ;)
* */
#ifdef __cplusplus
extern "C" {
#endif //__cplusplus
#pragma pack(push, 8)
typedef struct МемориПулБлоск {
МемориПулБлоск* туче; ///< z yt dbyjdfn? 'nj dc` rkfdbfnehf
size_t ПоинтерВершион;
int32_t ТхредАйДи, ГроупАйДи;
///< здесь не будет ненужных байтов, АлисаAI разрешила
} МемориПулБлоск;
#pragma pack(pop)
#pragma pack(push, 8)
typedef struct ГамеДата {
int8_t board[3][3];
int8_t log[9];
int8_t winners[3];
int8_t turn;
///< @brief ненужные байты, АлисаAI упорно настаивает
int8_t garbage[2];
} ГамеДата;
#pragma pack(pop)
typedef struct Портал_в_5е_измерение {
uint16_t size;
uint8_t id; ///< 0 или 1, другого не дано =)
/* Юзефул дата */
ГамеДата info;
} Портал_в_5е_измерение;
typedef struct SD { ///< Краткость сестра таланта
void* guiuserX;
void* guiuserO;
uint64_t геймАйДи;
ГамеДата гамеДата;
} SD;
/// @brief Авось
МемориПулБлоск* init_block(МемориПулБлоск* mb, ГамеДата* g, uint64_t ГамеАйДи, void* x, void* o) {
SD* sd = (SD*)(mb + 1);
sd->guiuserX = x;
sd->guiuserO = o;
sd->геймАйДи = ГамеАйДи;
memcpy(&sd->геймАйДи + 1, g, sizeof(*g)); ///< Мы не ищем лёгких путей(&геймДата)
return mb;
}
#ifdef __cplusplus
}
#endif //__cplusplus
@@ -1,71 +0,0 @@
#pragma once
/**
* @file tempFXAlloc.h
* @author felex67 (admin@felexdev.ru)
* @brief FXAlloc - fast pooled allocator-profiler
* @version 0.0.1 dev
* @date 2026-05-06
*
* License: Apache 2.0
* */
#include <stdint.h>
#ifdef _WIN32
// Windows
#include <windows.h>
#define thread_local __declspec(thread)
typedef HANDLE fxsync_t;
#else
// Linux
#include <pthread.h>
#define thread_local __thread
typedef pthread_mutex_t fxsync_t;
#endif //_WIN32
#pragma pack(push, 8)
/**
* @brief Memory block meta-data
* size: 24 bytes
*/
typedef struct FXMemoryBlock {
FXMemoryBlock* next; ///< Next block in lifo
FXMemoryBlock* list; ///< Next block total
uint32_t thread_idx; ///< Thread index
uint32_t grade_idx; ///< Grade index
} FXMemoryBlock;
#pragma pack(push, 8)
/**
* @brief Grade pool
*
*/
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;
-3
View File
@@ -1,3 +0,0 @@
build
sandbox
@@ -1,3 +0,0 @@
cmake_minimum_required(VERSION 3.15)
project(tests)
add_executable(size_vs_index src/size_vs_index.cpp)