Files
hakmem/docs/status/P2.3_TINY_CONFIG_REORGANIZATION_TASK.md
Moe Charm (CI) a9ddb52ad4 ENV cleanup: Remove BG/HotMag vars & guard fprintf (Larson 52.3M ops/s)
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>
2025-11-26 14:45:26 +09:00

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:

  1. Reduce variable count: 113 → 40 (-64%)
  2. Organize by category: TLS Cache, SFC, P0, Header, Adaptive, Debug
  3. Maintain backward compatibility: 6-month deprecation period (2025-11-26 → 2026-05-26)
  4. 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 API
  • core/hakmem_tiny_config.c - Parsing and backward-compat shims
  • Makefile - Add new object files

Documentation

  • DEPRECATED.md - Add TINY consolidation section (113→40 mapping)
  • CONFIGURATION.md - Update TINY section with new canonical vars
  • scripts/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

  1. Variable Reduction: 113 → 40 canonical variables (-64%)
  2. Backward Compatibility: All 113 legacy variables still work with deprecation warnings
  3. Build Success: Clean compile with no errors
  4. Performance: No regression (within ±2% of baseline)
  5. Validation: Script correctly identifies deprecated/invalid variables
  6. 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)