Аллокатор переехал в отдельный репозиторий fxalloc
This commit is contained in:
@@ -1,2 +0,0 @@
|
||||
build
|
||||
sandbox
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"CurrentProjectSetting": "x64-Debug"
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"OutputFoldersPerTargetSystem": {
|
||||
"Local Machine": [
|
||||
"out\\build\\x64-Debug",
|
||||
"out\\install\\x64-Debug"
|
||||
]
|
||||
},
|
||||
"ExpandedNodes": [
|
||||
"",
|
||||
"\\includes",
|
||||
"\\src"
|
||||
],
|
||||
"SelectedNode": "\\src\\FXAlloc.c",
|
||||
"PreviewInSolutionExplorer": false
|
||||
}
|
||||
BIN
Binary file not shown.
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.
Vendored
-28
@@ -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"
|
||||
}
|
||||
@@ -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`.
|
||||
* Все «заклинания» работают только в тестовом режиме веселья.
|
||||
|
||||
> **Вывод:** даже в мире строгих вычислений есть место магии, абсурду и улыбке. Пусть этот эксперимент напоминает нам, что программирование — это ещё и творчество!
|
||||
@@ -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
@@ -1,20 +0,0 @@
|
||||
# README.md
|
||||
|
||||
## Сервер:
|
||||
* OS: Ubuntu Server 24.04;
|
||||
* CPU: Intel Core i5‑3470, 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 С запасом и поправкой на накладные расходы
|
||||
@@ -1,36 +0,0 @@
|
||||
# ccpp/fxalloc/PROGRESS.md
|
||||
|
||||
## Формат
|
||||
* Даты следуют в обратном хронологическом порядке
|
||||
* Формат таблиц: Статус → Задача → Краткое описание
|
||||
|
||||
## Условные обозначения
|
||||
* ➤ — задача выполняется
|
||||
* ✅ — задача выполнена полностью
|
||||
* ⚠️ — задача отложена
|
||||
* ☐ — задача ожидает выполнения
|
||||
|
||||
Структура таблиц
|
||||
|
||||
| Статус | Задача | Описание |
|
||||
|:------:|:-------|:---------|
|
||||
|
||||
|
||||
## Общий прогресс
|
||||
| Статус | Задача | Описание |
|
||||
|:------:|:-------|:---------|
|
||||
| ✅ |Препрофилирование|Расчёт предполагаемых нагрузок малые/средние/максимальные|
|
||||
| ➤ |**Проектирование архитектуры**|Определение узких мест, API, внутреннего устройства|
|
||||
| ☐ |Logic|Реализация внутренней логики модуля|
|
||||
| ☐ |API|Реализация внешнего интерфейса|
|
||||
| ☐ |Предварительное тестирование|Юнит-тесты, бенчмарки|
|
||||
| ☐ |Нагрузочные тесты|Анализ работы при максимальных нагрузках|
|
||||
| ☐ |Интеграция|Тестирование взаимодействия с другими модулями|
|
||||
| ☐ |Документирование|Подготовка технической документации модуля|
|
||||
| ☐ |Итоги|Финальная проверка, анализ работы, фидбэк(если предусмотрен)|
|
||||
|
||||
|
||||
## 23.04.2026
|
||||
| Статус | Задача | Описание |
|
||||
|:------:|:-------|:---------|
|
||||
| ✅ |Препрофилирование|Расчёт предполагаемых нагрузок малые/средние/максимальные|
|
||||
@@ -1,15 +0,0 @@
|
||||
# ccpp/fxalloc/README.md
|
||||
|
||||
# Описание
|
||||
|
||||
Создаётся с помощью кувалды и како-то там матери...
|
||||
|
||||
# Установка
|
||||
|
||||
```Console
|
||||
guiuser@pc:~$ sudo echo("Установка") ↵
|
||||
```
|
||||
|
||||
# Настройка
|
||||
|
||||
Подровнять напильником!
|
||||
@@ -1,21 +0,0 @@
|
||||
# ccpp/fxalloc/TODO.md
|
||||
|
||||
## Информация
|
||||
* Файл для отслеживания текущих задач модуля **FXAlloc**
|
||||
* Последнее обновление: [25.04.2026]
|
||||
|
||||
## Условные обозначения
|
||||
* 🔥 - Наивысший приоритет
|
||||
* 🔴 - Высокий приоритет
|
||||
* 🟡 - Средний приоритет
|
||||
* 🟢 - Низкий приоритет
|
||||
|
||||
## Задачи в процессе
|
||||
|Срочность|Компонент|Задача|Описание|
|
||||
|:-------:|:-------:|:-----|:-------|
|
||||
|🔥|**FXAlloc**|**Проектирование архитектуры**|Интерфейс, внутреннее устройство|
|
||||
|🔥|**FXAlloc**|**Документация**|Описание архитектуры решения, ведение DAIRY.md|
|
||||
|🔥|**FXAlloc**|**Logic**|Реализации внутренних методов|
|
||||
|🔥|**FXAlloc**|**API**|Реализация внешних методов|
|
||||
|🔥|**FXAlloc**|**Тестирование**|Написание юнит-тестов|
|
||||
|🔥|**FXAlloc**|**Оптимизация**|Анализ производительности|
|
||||
@@ -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;
|
||||
@@ -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
|
||||
@@ -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;
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user