Phase 1 完了:環境変数整理 + fprintf デバッグガード ENV変数削除(BG/HotMag系): - core/hakmem_tiny_init.inc: HotMag ENV 削除 (~131 lines) - core/hakmem_tiny_bg_spill.c: BG spill ENV 削除 - core/tiny_refill.h: BG remote 固定値化 - core/hakmem_tiny_slow.inc: BG refs 削除 fprintf Debug Guards (#if !HAKMEM_BUILD_RELEASE): - core/hakmem_shared_pool.c: Lock stats (~18 fprintf) - core/page_arena.c: Init/Shutdown/Stats (~27 fprintf) - core/hakmem.c: SIGSEGV init message ドキュメント整理: - 328 markdown files 削除(旧レポート・重複docs) 性能確認: - Larson: 52.35M ops/s (前回52.8M、安定動作✅) - ENV整理による機能影響なし - Debug出力は一部残存(次phase で対応) 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
20 KiB
P2.3: TINY Allocator Configuration Reorganization Task
Task ID: P2.3 Complexity: Medium-High (2 days) Dependencies: P2.1, P2.2 completed Objective: Reorganize 113 TINY allocator variables → 40 canonical variables with backward compatibility
Executive Summary
The TINY allocator (1-2048B) currently has 113 configuration variables scattered across multiple subsystems with inconsistent naming and unclear hierarchy. This task consolidates them into 40 canonical variables organized by functional category.
Key Goals:
- Reduce variable count: 113 → 40 (-64%)
- Organize by category: TLS Cache, SFC, P0, Header, Adaptive, Debug
- Maintain backward compatibility: 6-month deprecation period (2025-11-26 → 2026-05-26)
- Simplify user experience: Clear hierarchy and naming conventions
Current State Analysis
Variable Inventory (113 total)
TLS Cache (18 variables) → 6 canonical
Current (scattered):
HAKMEM_TINY_TLS_CAP
HAKMEM_TINY_TLS_REFILL
HAKMEM_TINY_TLS_CAP_C1, C2, C3, C4, C5, C6, C7 (7 per-class overrides)
HAKMEM_TINY_TLS_REFILL_C1, C2, C3, C4, C5, C6, C7 (7 per-class overrides)
HAKMEM_TINY_DRAIN_THRESH
HAKMEM_TINY_DRAIN_INTERVAL_MS
Canonical (6):
HAKMEM_TINY_TLS_CAP # Global default capacity (default: 64)
HAKMEM_TINY_TLS_REFILL # Global default refill batch (default: 16)
HAKMEM_TINY_TLS_DRAIN_THRESH # Drain threshold (default: 128)
HAKMEM_TINY_TLS_DRAIN_INTERVAL # Drain interval in ms (default: 100)
HAKMEM_TINY_TLS_CLASS_OVERRIDE # Per-class override (format: "C1:128:32,C3:64:16")
HAKMEM_TINY_TLS_HOT_CLASSES # Hot class list (format: "C1,C3,C5", default: auto-detect)
Super Front Cache (12 variables) → 4 canonical
Current:
HAKMEM_TINY_SFC_ENABLE
HAKMEM_TINY_SFC_CAPACITY
HAKMEM_TINY_SFC_HOT_CLASSES
HAKMEM_TINY_SFC_CAPACITY_C1, C2, C3, C4, C5, C6, C7 (7 per-class)
HAKMEM_TINY_SFC_PREFETCH
HAKMEM_TINY_SFC_STATS
Canonical (4):
HAKMEM_TINY_SFC_ENABLE # Master toggle (default: 1)
HAKMEM_TINY_SFC_CAPACITY # Global capacity (default: 128)
HAKMEM_TINY_SFC_HOT_CLASSES # Hot class count (default: 8)
HAKMEM_TINY_SFC_CLASS_OVERRIDE # Per-class override (format: "C1:256,C3:128")
P0 Batch Optimization (16 variables) → 5 canonical
Current:
HAKMEM_TINY_P0_ENABLE
HAKMEM_TINY_P0_BATCH
HAKMEM_TINY_P0_BATCH_C1, C2, C3, C4, C5, C6, C7 (7 per-class)
HAKMEM_TINY_P0_NO_DRAIN
HAKMEM_TINY_P0_LOG
HAKMEM_TINY_P0_STATS
HAKMEM_TINY_P0_THRESHOLD
HAKMEM_TINY_P0_MIN_SAMPLES
HAKMEM_TINY_P0_ADAPTIVE
Canonical (5):
HAKMEM_TINY_P0_ENABLE # Master toggle (default: 1)
HAKMEM_TINY_P0_BATCH # Global batch size (default: 16)
HAKMEM_TINY_P0_CLASS_OVERRIDE # Per-class override (format: "C1:32,C3:24")
HAKMEM_TINY_P0_NO_DRAIN # Disable remote drain (debug only, default: 0)
HAKMEM_TINY_P0_LOG # Enable counter validation logging (default: 0)
Header Configuration (8 variables) → 3 canonical
Current:
HAKMEM_TINY_HEADER_CLASSIDX
HAKMEM_TINY_HEADER_SIZE
HAKMEM_TINY_HEADER_CANARY
HAKMEM_TINY_HEADER_MAGIC
HAKMEM_TINY_HEADER_C1_OFFSET, C2_OFFSET, C3_OFFSET, ... (7 per-class)
Canonical (3):
HAKMEM_TINY_HEADER_CLASSIDX # Store class_idx in header (default: 1, enables fast free)
HAKMEM_TINY_HEADER_CANARY # Canary protection (default: via HAKMEM_INTEGRITY_CHECKS)
HAKMEM_TINY_HEADER_CLASS_OFFSET # Per-class offset override (format: "C1:0,C7:1")
Adaptive Sizing (22 variables) → 8 canonical
Current:
HAKMEM_TINY_ADAPTIVE_SIZING
HAKMEM_TINY_ADAPTIVE_INTERVAL_MS
HAKMEM_TINY_ADAPTIVE_WINDOW
HAKMEM_TINY_CAP_LEARN
HAKMEM_TINY_CAP_LEARN_RATE
HAKMEM_TINY_CAP_MIN, CAP_MAX (per-class: 14 variables)
... (various thresholds and tuning params)
Canonical (8):
HAKMEM_TINY_ADAPTIVE_ENABLE # Master toggle (merged from ADAPTIVE_SIZING + CAP_LEARN)
HAKMEM_TINY_ADAPTIVE_INTERVAL # Adjustment interval in ms (default: 1000)
HAKMEM_TINY_ADAPTIVE_WINDOW # Sample window (default: via HAKMEM_ALLOC_LEARN_WINDOW)
HAKMEM_TINY_ADAPTIVE_RATE # Learning rate (default: via HAKMEM_ALLOC_LEARN_RATE)
HAKMEM_TINY_ADAPTIVE_CAP_MIN # Global min capacity (default: 16)
HAKMEM_TINY_ADAPTIVE_CAP_MAX # Global max capacity (default: 256)
HAKMEM_TINY_ADAPTIVE_CLASS_RANGE # Per-class range (format: "C1:32-512,C3:16-128")
HAKMEM_TINY_ADAPTIVE_ADVANCED # Enable advanced overrides (default: 0)
Prewarm & Initialization (10 variables) → 4 canonical
Current:
HAKMEM_TINY_PREWARM
HAKMEM_TINY_PREWARM_COUNT
HAKMEM_TINY_PREWARM_C1, C2, C3, C4, C5, C6, C7 (7 per-class)
HAKMEM_TINY_LAZY_INIT
Canonical (4):
HAKMEM_TINY_PREWARM # Master toggle (default: 0)
HAKMEM_TINY_PREWARM_COUNT # Global prewarm count (default: 8)
HAKMEM_TINY_PREWARM_CLASSES # Class-specific prewarm (format: "C1:16,C3:8")
HAKMEM_TINY_LAZY_INIT # Lazy initialization (default: 1)
Statistics & Debug (27 variables) → 10 canonical
Current:
HAKMEM_TINY_STATS
HAKMEM_TINY_STATS_INTERVAL
HAKMEM_TINY_STATS_VERBOSE
HAKMEM_TINY_COUNTERS
HAKMEM_TINY_PROFILE_* # 10+ profiling flags
HAKMEM_TINY_TRACE_* # 8+ tracing flags
... (various debug knobs)
Canonical (10):
# Most moved to global HAKMEM_DEBUG_LEVEL, HAKMEM_DEBUG_TINY, etc. (P0.4)
HAKMEM_TINY_STATS_INTERVAL # Stats reporting interval (default: 10s)
HAKMEM_TINY_PROFILE_REFILL # Profile refill operations (default: 0)
HAKMEM_TINY_PROFILE_DRAIN # Profile drain operations (default: 0)
HAKMEM_TINY_PROFILE_CACHE # Profile cache hit/miss (default: 0)
HAKMEM_TINY_PROFILE_P0 # Profile P0 batch operations (default: 0)
HAKMEM_TINY_PROFILE_SFC # Profile SFC operations (default: 0)
HAKMEM_TINY_TRACE_CLASS # Trace specific class (format: "C1,C3")
HAKMEM_TINY_TRACE_REFILL # Trace refill calls (default: 0)
HAKMEM_TINY_TRACE_DRAIN # Trace drain calls (default: 0)
HAKMEM_TINY_COUNTERS_VALIDATE # Validate counter integrity (default: 1 in DEBUG)
Target Architecture
Canonical Variables (40 total)
# TLS Cache (6)
HAKMEM_TINY_TLS_CAP
HAKMEM_TINY_TLS_REFILL
HAKMEM_TINY_TLS_DRAIN_THRESH
HAKMEM_TINY_TLS_DRAIN_INTERVAL
HAKMEM_TINY_TLS_CLASS_OVERRIDE
HAKMEM_TINY_TLS_HOT_CLASSES
# Super Front Cache (4)
HAKMEM_TINY_SFC_ENABLE
HAKMEM_TINY_SFC_CAPACITY
HAKMEM_TINY_SFC_HOT_CLASSES
HAKMEM_TINY_SFC_CLASS_OVERRIDE
# P0 Batch Optimization (5)
HAKMEM_TINY_P0_ENABLE
HAKMEM_TINY_P0_BATCH
HAKMEM_TINY_P0_CLASS_OVERRIDE
HAKMEM_TINY_P0_NO_DRAIN
HAKMEM_TINY_P0_LOG
# Header Configuration (3)
HAKMEM_TINY_HEADER_CLASSIDX
HAKMEM_TINY_HEADER_CANARY
HAKMEM_TINY_HEADER_CLASS_OFFSET
# Adaptive Sizing (8)
HAKMEM_TINY_ADAPTIVE_ENABLE
HAKMEM_TINY_ADAPTIVE_INTERVAL
HAKMEM_TINY_ADAPTIVE_WINDOW
HAKMEM_TINY_ADAPTIVE_RATE
HAKMEM_TINY_ADAPTIVE_CAP_MIN
HAKMEM_TINY_ADAPTIVE_CAP_MAX
HAKMEM_TINY_ADAPTIVE_CLASS_RANGE
HAKMEM_TINY_ADAPTIVE_ADVANCED
# Prewarm & Init (4)
HAKMEM_TINY_PREWARM
HAKMEM_TINY_PREWARM_COUNT
HAKMEM_TINY_PREWARM_CLASSES
HAKMEM_TINY_LAZY_INIT
# Statistics & Profiling (10)
HAKMEM_TINY_STATS_INTERVAL
HAKMEM_TINY_PROFILE_REFILL
HAKMEM_TINY_PROFILE_DRAIN
HAKMEM_TINY_PROFILE_CACHE
HAKMEM_TINY_PROFILE_P0
HAKMEM_TINY_PROFILE_SFC
HAKMEM_TINY_TRACE_CLASS
HAKMEM_TINY_TRACE_REFILL
HAKMEM_TINY_TRACE_DRAIN
HAKMEM_TINY_COUNTERS_VALIDATE
Implementation Plan (2 days)
Day 1: Consolidation Shims + Core Implementation
Task 1.1: Create Consolidation Shims (3 hours)
Create core/hakmem_tiny_config.h and core/hakmem_tiny_config.c:
// core/hakmem_tiny_config.h
#pragma once
#include <stddef.h>
// TLS Cache Configuration
typedef struct {
int global_cap;
int global_refill;
int drain_thresh;
int drain_interval_ms;
// Per-class overrides (parsed from CLASS_OVERRIDE)
int class_cap[7]; // -1 = use global
int class_refill[7]; // -1 = use global
// Hot classes
int hot_classes[7]; // 1 = hot, 0 = cold
int hot_count;
} HakmemTinyTLSConfig;
// SFC Configuration
typedef struct {
int enabled;
int global_capacity;
int hot_classes_count;
int class_capacity[7]; // -1 = use global
} HakmemTinySFCConfig;
// P0 Configuration
typedef struct {
int enabled;
int global_batch;
int class_batch[7]; // -1 = use global
int no_drain;
int log;
} HakmemTinyP0Config;
// Header Configuration
typedef struct {
int classidx_enabled;
int canary_enabled;
int class_offset[7]; // -1 = default
} HakmemTinyHeaderConfig;
// Adaptive Configuration
typedef struct {
int enabled;
int interval_ms;
int window;
double rate;
int cap_min;
int cap_max;
int class_min[7]; // -1 = use global
int class_max[7]; // -1 = use global
int advanced;
} HakmemTinyAdaptiveConfig;
// Prewarm Configuration
typedef struct {
int enabled;
int global_count;
int class_count[7]; // -1 = use global
int lazy_init;
} HakmemTinyPrewarmConfig;
// Statistics Configuration
typedef struct {
int interval_sec;
int profile_refill;
int profile_drain;
int profile_cache;
int profile_p0;
int profile_sfc;
int trace_class[7]; // 1 = trace this class
int trace_refill;
int trace_drain;
int counters_validate;
} HakmemTinyStatsConfig;
// Master configuration
typedef struct {
HakmemTinyTLSConfig tls;
HakmemTinySFCConfig sfc;
HakmemTinyP0Config p0;
HakmemTinyHeaderConfig header;
HakmemTinyAdaptiveConfig adaptive;
HakmemTinyPrewarmConfig prewarm;
HakmemTinyStatsConfig stats;
} HakmemTinyConfig;
// Parse new + legacy envs. New vars take precedence.
HakmemTinyConfig hakmem_tiny_config_parse(void);
// Backfill legacy env vars when only new vars are set
void hakmem_tiny_config_apply_compat_env(void);
Task 1.2: Implement Parsing Logic (4 hours)
core/hakmem_tiny_config.c:
#include "hakmem_tiny_config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int get_env_int_default(const char* key, int fallback) {
const char* v = getenv(key);
return v ? atoi(v) : fallback;
}
static double get_env_double_default(const char* key, double fallback) {
const char* v = getenv(key);
return v ? atof(v) : fallback;
}
static void warn_deprecated(const char* old_var, const char* new_var) {
fprintf(stderr,
"[DEPRECATED] %s is deprecated; use %s instead. "
"Sunset date: 2026-05-26. See DEPRECATED.md for migration.\n",
old_var, new_var);
}
// Parse "C1:128:32,C3:64:16" format for CLASS_OVERRIDE
static void parse_class_override(const char* str, int* cap_array, int* refill_array) {
if (!str) return;
char buf[256];
strncpy(buf, str, sizeof(buf) - 1);
buf[sizeof(buf) - 1] = '\0';
char* token = strtok(buf, ",");
while (token) {
int class_idx, cap, refill;
if (sscanf(token, "C%d:%d:%d", &class_idx, &cap, &refill) == 3) {
if (class_idx >= 1 && class_idx <= 7) {
cap_array[class_idx - 1] = cap;
refill_array[class_idx - 1] = refill;
}
}
token = strtok(NULL, ",");
}
}
// Similar parsing for other override formats...
HakmemTinyConfig hakmem_tiny_config_parse(void) {
HakmemTinyConfig cfg;
memset(&cfg, -1, sizeof(cfg)); // Initialize to -1 (not set)
// TLS Cache
cfg.tls.global_cap = get_env_int_default("HAKMEM_TINY_TLS_CAP", 64);
cfg.tls.global_refill = get_env_int_default("HAKMEM_TINY_TLS_REFILL", 16);
cfg.tls.drain_thresh = get_env_int_default("HAKMEM_TINY_TLS_DRAIN_THRESH",
get_env_int_default("HAKMEM_TINY_DRAIN_THRESH", 128));
if (getenv("HAKMEM_TINY_DRAIN_THRESH")) {
warn_deprecated("HAKMEM_TINY_DRAIN_THRESH", "HAKMEM_TINY_TLS_DRAIN_THRESH");
}
// Parse CLASS_OVERRIDE
const char* override = getenv("HAKMEM_TINY_TLS_CLASS_OVERRIDE");
if (override) {
parse_class_override(override, cfg.tls.class_cap, cfg.tls.class_refill);
} else {
// Fallback to legacy per-class vars
for (int i = 0; i < 7; i++) {
char key[64];
snprintf(key, sizeof(key), "HAKMEM_TINY_TLS_CAP_C%d", i + 1);
if (getenv(key)) {
cfg.tls.class_cap[i] = get_env_int_default(key, -1);
warn_deprecated(key, "HAKMEM_TINY_TLS_CLASS_OVERRIDE");
}
snprintf(key, sizeof(key), "HAKMEM_TINY_TLS_REFILL_C%d", i + 1);
if (getenv(key)) {
cfg.tls.class_refill[i] = get_env_int_default(key, -1);
warn_deprecated(key, "HAKMEM_TINY_TLS_CLASS_OVERRIDE");
}
}
}
// ... (similar parsing for SFC, P0, Header, Adaptive, Prewarm, Stats)
return cfg;
}
void hakmem_tiny_config_apply_compat_env(void) {
HakmemTinyConfig cfg = hakmem_tiny_config_parse();
// Backfill legacy vars for existing code paths
if (cfg.tls.global_cap > 0 && !getenv("HAKMEM_TINY_TLS_CAP")) {
char buf[32];
snprintf(buf, sizeof(buf), "%d", cfg.tls.global_cap);
setenv("HAKMEM_TINY_TLS_CAP", buf, 0);
}
// Backfill per-class vars if CLASS_OVERRIDE was used
for (int i = 0; i < 7; i++) {
if (cfg.tls.class_cap[i] > 0) {
char key[64], val[32];
snprintf(key, sizeof(key), "HAKMEM_TINY_TLS_CAP_C%d", i + 1);
if (!getenv(key)) {
snprintf(val, sizeof(val), "%d", cfg.tls.class_cap[i]);
setenv(key, val, 0);
}
}
}
// ... (similar backfill for other subsystems)
}
__attribute__((constructor)) static void hakmem_tiny_config_ctor(void) {
hakmem_tiny_config_apply_compat_env();
}
Task 1.3: Update Makefile (30 minutes)
Add new object files:
OBJS_BASE = \
core/hakmem_tiny_config.o \
# ... (existing objects)
Day 2: Documentation + Testing + Validation
Task 2.1: Update DEPRECATED.md (1 hour)
Add new section:
### TINY Allocator Configuration (P2.3 Consolidation)
**Deprecated**: 2025-11-26
**Sunset**: 2026-05-26
**113 variables → 40 variables (-64%)**
#### TLS Cache (18→6)
| Deprecated Variable | Replacement | Notes |
|---------------------|-------------|-------|
| `HAKMEM_TINY_DRAIN_THRESH` | `HAKMEM_TINY_TLS_DRAIN_THRESH` | Renamed for clarity |
| `HAKMEM_TINY_TLS_CAP_C1` ... `C7` | `HAKMEM_TINY_TLS_CLASS_OVERRIDE` | Use format "C1:128:32,C3:64:16" |
| `HAKMEM_TINY_TLS_REFILL_C1` ... `C7` | `HAKMEM_TINY_TLS_CLASS_OVERRIDE` | Merged into override string |
#### SFC (12→4)
| Deprecated Variable | Replacement | Notes |
|---------------------|-------------|-------|
| `HAKMEM_TINY_SFC_CAPACITY_C1` ... `C7` | `HAKMEM_TINY_SFC_CLASS_OVERRIDE` | Use format "C1:256,C3:128" |
#### P0 (16→5)
| Deprecated Variable | Replacement | Notes |
|---------------------|-------------|-------|
| `HAKMEM_TINY_P0_BATCH_C1` ... `C7` | `HAKMEM_TINY_P0_CLASS_OVERRIDE` | Use format "C1:32,C3:24" |
| `HAKMEM_TINY_P0_STATS` | `HAKMEM_TINY_PROFILE_P0` | Moved to profiling category |
| `HAKMEM_TINY_P0_THRESHOLD` | (removed) | Auto-tuned |
| `HAKMEM_TINY_P0_MIN_SAMPLES` | (removed) | Auto-tuned |
| `HAKMEM_TINY_P0_ADAPTIVE` | `HAKMEM_TINY_ADAPTIVE_ENABLE` | Merged into adaptive system |
... (continue for all 113 variables)
**Migration Example**:
```bash
# OLD (deprecated, will be removed 2026-05-26)
export HAKMEM_TINY_TLS_CAP_C1=128
export HAKMEM_TINY_TLS_REFILL_C1=32
export HAKMEM_TINY_TLS_CAP_C3=64
export HAKMEM_TINY_TLS_REFILL_C3=16
export HAKMEM_TINY_DRAIN_THRESH=256
# NEW (use this)
export HAKMEM_TINY_TLS_CLASS_OVERRIDE="C1:128:32,C3:64:16"
export HAKMEM_TINY_TLS_DRAIN_THRESH=256
#### Task 2.2: Update scripts/validate_config.sh (1 hour)
Add 113 deprecated variables to registry:
```bash
declare -A DEPRECATED_VARS=(
# ... (existing vars)
# TINY TLS (18 vars deprecated)
["HAKMEM_TINY_DRAIN_THRESH"]="HAKMEM_TINY_TLS_DRAIN_THRESH"
["HAKMEM_TINY_TLS_CAP_C1"]="HAKMEM_TINY_TLS_CLASS_OVERRIDE"
["HAKMEM_TINY_TLS_CAP_C2"]="HAKMEM_TINY_TLS_CLASS_OVERRIDE"
# ... (continue for all C1-C7)
# TINY SFC (12 vars deprecated)
["HAKMEM_TINY_SFC_CAPACITY_C1"]="HAKMEM_TINY_SFC_CLASS_OVERRIDE"
# ... (continue)
# ... (continue for all 113 deprecated vars)
)
# Add 40 canonical vars to KNOWN_VARS
declare -a KNOWN_VARS=(
# ... (existing vars)
# TINY TLS (6)
"HAKMEM_TINY_TLS_CAP"
"HAKMEM_TINY_TLS_REFILL"
"HAKMEM_TINY_TLS_DRAIN_THRESH"
"HAKMEM_TINY_TLS_DRAIN_INTERVAL"
"HAKMEM_TINY_TLS_CLASS_OVERRIDE"
"HAKMEM_TINY_TLS_HOT_CLASSES"
# ... (continue for all 40 canonical vars)
)
# Add validation for override string format
validate_class_override() {
local var="$1"
local val="$2"
# Check format: "C1:128:32,C3:64:16"
if [[ ! "$val" =~ ^(C[1-7]:[0-9]+:[0-9]+(,C[1-7]:[0-9]+:[0-9]+)*)?$ ]]; then
log_error "$var has invalid format (expected: 'C1:128:32,C3:64:16')"
return 1
fi
}
Task 2.3: Update CONFIGURATION.md (1 hour)
Update TINY Allocator section with new canonical variables and examples.
Task 2.4: Testing (3 hours)
Test 1: Build Verification
make clean
make bench_random_mixed_hakmem
./out/release/bench_random_mixed_hakmem
# Expected: Clean build, no warnings, baseline performance maintained
Test 2: Backward Compatibility (Legacy Vars)
# Test with old per-class vars
export HAKMEM_TINY_TLS_CAP_C1=256
export HAKMEM_TINY_TLS_REFILL_C1=32
export HAKMEM_TINY_DRAIN_THRESH=128
./out/release/bench_random_mixed_hakmem
# Expected: Deprecation warnings shown, functionality preserved
Test 3: New Variables (CLASS_OVERRIDE)
unset HAKMEM_TINY_TLS_CAP_C1 HAKMEM_TINY_TLS_REFILL_C1
export HAKMEM_TINY_TLS_CLASS_OVERRIDE="C1:256:32,C3:128:16"
export HAKMEM_TINY_TLS_DRAIN_THRESH=128
./out/release/bench_random_mixed_hakmem
# Expected: No warnings, same performance
Test 4: Validation Script
./scripts/validate_config.sh
# Expected: Show deprecation warnings for old vars, validate new vars
Test 5: Multi-threaded Stability
./out/release/larson_hakmem 8
# Expected: No crashes, stable performance
Deliverables Checklist
Code
core/hakmem_tiny_config.h- Configuration structures and APIcore/hakmem_tiny_config.c- Parsing and backward-compat shimsMakefile- Add new object files
Documentation
DEPRECATED.md- Add TINY consolidation section (113→40 mapping)CONFIGURATION.md- Update TINY section with new canonical varsscripts/validate_config.sh- Add 113 deprecated vars, 40 canonical vars
Testing
- Build verification (clean compile)
- Backward compatibility test (legacy vars work)
- New variables test (CLASS_OVERRIDE format)
- Validation script test (deprecation warnings)
- Multi-threaded stability test (Larson 8T)
- Performance regression check (within ±2% of baseline)
Success Criteria
- Variable Reduction: 113 → 40 canonical variables (-64%)
- Backward Compatibility: All 113 legacy variables still work with deprecation warnings
- Build Success: Clean compile with no errors
- Performance: No regression (within ±2% of baseline)
- Validation: Script correctly identifies deprecated/invalid variables
- Documentation: Complete migration guide in DEPRECATED.md
Timeline Estimate
| Task | Duration | Difficulty |
|---|---|---|
| 1.1: Create consolidation shims | 3 hours | Medium |
| 1.2: Implement parsing logic | 4 hours | Medium-High |
| 1.3: Update Makefile | 30 min | Easy |
| 2.1: Update DEPRECATED.md | 1 hour | Medium |
| 2.2: Update validate_config.sh | 1 hour | Medium |
| 2.3: Update CONFIGURATION.md | 1 hour | Medium |
| 2.4: Testing | 3 hours | Medium |
| Total | ~14 hours | ~2 days |
Notes for Implementation
Parsing Format Details
CLASS_OVERRIDE formats:
# TLS (capacity:refill)
HAKMEM_TINY_TLS_CLASS_OVERRIDE="C1:128:32,C3:64:16,C7:256:48"
# SFC (capacity only)
HAKMEM_TINY_SFC_CLASS_OVERRIDE="C1:256,C3:128,C5:64"
# P0 (batch size only)
HAKMEM_TINY_P0_CLASS_OVERRIDE="C1:32,C3:24,C7:16"
# Header (offset only)
HAKMEM_TINY_HEADER_CLASS_OFFSET="C1:0,C7:1"
# Adaptive (min-max range)
HAKMEM_TINY_ADAPTIVE_CLASS_RANGE="C1:32-512,C3:16-256"
Advanced Override Pattern
Similar to P2.2 (Learning Systems), use HAKMEM_TINY_ADAPTIVE_ADVANCED=1 to enable deprecated fine-tuning knobs (P0_THRESHOLD, P0_MIN_SAMPLES, etc.).
Error Handling
- Invalid format in CLASS_OVERRIDE → log warning, ignore that entry
- Class index out of range (not 1-7) → log warning, ignore
- Negative values → log error, use default
Reference Implementation (P2.2)
See core/hakmem_alloc_learner.c for similar consolidation pattern:
- ENV parsing with fallback to legacy vars
- Deprecation warnings
- Auto-backfill for existing code paths
- Constructor-based initialization
Task Specification Version: 1.0 Created: 2025-11-26 For: ChatGPT (or other AI assistant) Context: HAKMEM Phase 2 cleanup (P2.3 - TINY Config Reorganization)