2025-12-11 20:39:46 +09:00
|
|
|
// tiny_c7_ultra_box.h - C7 ULTRA TLS box (Phase PERF-ULTRA-ALLOC-OPT-1: Array-based TLS cache)
|
2025-12-10 22:19:32 +09:00
|
|
|
#pragma once
|
|
|
|
|
|
2025-12-10 22:57:26 +09:00
|
|
|
#include <stdbool.h>
|
2025-12-10 22:19:32 +09:00
|
|
|
#include <stddef.h>
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
#include "tiny_c7_ultra_segment_box.h"
|
|
|
|
|
|
2025-12-11 20:39:46 +09:00
|
|
|
// TLS cache capacity (optimized for C7: 128 slots)
|
|
|
|
|
#define TINY_C7_ULTRA_CAP 128
|
|
|
|
|
|
|
|
|
|
// Hot box: per-thread TLS context (Phase PERF-ULTRA-ALLOC-OPT-1: optimized layout)
|
|
|
|
|
// Hot fields first for L1 cache locality
|
2025-12-10 22:19:32 +09:00
|
|
|
typedef struct tiny_c7_ultra_tls_t {
|
2025-12-11 20:39:46 +09:00
|
|
|
uint16_t count; // Hot: alloc/free both access every time (FIRST field)
|
|
|
|
|
uint16_t _pad;
|
|
|
|
|
void* freelist[TINY_C7_ULTRA_CAP]; // Array of BASE pointers (hot path)
|
|
|
|
|
|
|
|
|
|
// Cold fields: used only during refill/segment learning
|
|
|
|
|
uintptr_t seg_base; // Segment base for range check
|
|
|
|
|
uintptr_t seg_end; // Segment end for range check
|
|
|
|
|
tiny_c7_ultra_segment_t* seg; // Owning segment
|
|
|
|
|
void* page_base; // Current page base
|
|
|
|
|
size_t block_size; // C7 block size
|
|
|
|
|
uint32_t page_idx; // Segment page index
|
|
|
|
|
tiny_c7_ultra_page_meta_t* page_meta; // Current page meta
|
|
|
|
|
bool headers_initialized; // Carved headers valid?
|
2025-12-10 22:19:32 +09:00
|
|
|
} tiny_c7_ultra_tls_t;
|
|
|
|
|
|
|
|
|
|
// TLS accessor
|
|
|
|
|
tiny_c7_ultra_tls_t* tiny_c7_ultra_tls_get(void);
|
|
|
|
|
|
2025-12-11 20:39:46 +09:00
|
|
|
// Phase PERF-ULTRA-ALLOC-OPT-1: Optimized alloc/free entry points
|
2025-12-10 22:19:32 +09:00
|
|
|
void* tiny_c7_ultra_alloc(size_t size);
|
|
|
|
|
void tiny_c7_ultra_free(void* ptr);
|
2025-12-11 20:39:46 +09:00
|
|
|
|
|
|
|
|
// Internal refill function (cold path)
|
|
|
|
|
bool tiny_c7_ultra_refill(tiny_c7_ultra_tls_t* tls);
|