Files
hakmem/docs/TINY_MODULARIZATION_ANALYSIS.md

768 lines
22 KiB
Markdown
Raw Normal View History

# Hakmem Tiny Allocator Modularization Analysis
## Executive Summary
**Current State:** 2245 lines in hakmem_tiny.c (reduced from 4555 lines - 51% reduction achieved)
**Recent Extractions:** 2136 lines successfully extracted into 4 .inc modules
**Analysis Date:** 2025-11-01
**Recommendation:** Continue phased modularization with focus on initialization, slab management, and hot-path inlining
---
## 1. Current File Organization
### 1.1 Main Module (hakmem_tiny.c)
**Size:** 2245 lines
**Largest Functions:**
1. `hak_tiny_init()` - 450 lines (20% of file!) - INITIALIZATION
2. `hak_tiny_trim()` - 116 lines (5%) - LIFECYCLE
3. `tiny_tls_cache_drain()` - 90 lines (4%) - LIFECYCLE
4. `tiny_slow_alloc_fast()` - 88 lines (4%) - COLD PATH
5. `allocate_new_slab()` - 79 lines (3.5%) - SLAB MANAGEMENT
6. `ultra_refill_sll()` - 56 lines (2.5%) - REFILL
7. `sll_refill_small_from_ss()` - 45 lines (2%) - REFILL
8. `superslab_tls_bump_fast()` - 45 lines (2%) - HOT PATH
9. `frontend_refill_fc()` - 44 lines (2%) - REFILL
10. `tiny_fast_refill_and_take()` - 39 lines (1.7%) - REFILL
**Top 10 Total:** 1042 lines (46% of remaining file!)
### 1.2 Successfully Extracted Modules
| File | Lines | Purpose | Type |
|------|-------|---------|------|
| hakmem_tiny_intel.inc | 863 | Intelligence/telemetry engine | Backend |
| hakmem_tiny_free.inc | 814 | Free path with remote/magazine handling | Hot path |
| hakmem_tiny_background.inc | 261 | Background workers and event queue | Backend |
| hakmem_tiny_alloc.inc | 198 | Wrapper-context allocation | Cold path |
| hakmem_tiny_tls_ops.h | 251 | TLS list operations (inline) | Hot path |
| hakmem_tiny_hotmag.inc.h | 147 | Hot magazine operations | Hot path |
| hakmem_tiny_ultra_front.inc.h | 52 | Ultra-fast frontend tier | Hot path |
| hakmem_tiny_slow.inc | 36 | Slow path stubs | Cold path |
| hakmem_tiny_remote.inc | 56 | Remote free queue handling | Backend |
### 1.3 Supporting Infrastructure Modules
| File | Lines | Purpose | Type |
|------|-------|---------|------|
| hakmem_tiny_superslab.{h,c} | 215+484 | SuperSlab allocator | Core backend |
| hakmem_tiny_magazine.{h,c} | 45+144 | Magazine data structures | Core |
| hakmem_tiny_stats.{h,c} | 277+251 | Statistics batching | Observability |
| hakmem_tiny_tls_list.h | 131 | TLS free list helpers | Core |
| hakmem_tiny_batch_refill.h | 232 | Batch refill logic | Hot path |
| hakmem_tiny_mini_mag.h | 148 | Mini-magazine helpers | Hot path |
### 1.4 API/Query Modules (Small)
| File | Lines | Purpose |
|------|-------|---------|
| hakmem_tiny_stats_api.h | 23 | Stats query API |
| hakmem_tiny_query_api.h | 18 | General query API |
| hakmem_tiny_rss_api.h | 9 | RSS utilities |
| hakmem_tiny_registry_api.h | 32 | Registry API |
| hakmem_tiny_{rss,query,registry}.c | 28+72+63 | API implementations |
---
## 2. Detailed Function Analysis
### 2.1 Initialization Section (470+ lines, 21%)
**Primary Function:** `hak_tiny_init()` (450 lines)
**Breakdown:**
- Lines 1526-1600: Environment variable parsing (74 lines)
- Registry, wrapper mode, remote drain, mem diet, magazine caps
- Lines 1600-1700: SuperSlab initialization (100 lines)
- Capacity setup, queue initialization, background workers
- Lines 1700-1850: Magazine initialization (150 lines)
- Per-class magazine setup, TLS initialization
- Lines 1850-1976: Backend worker spawning (126 lines)
- Intelligence engine, background refill workers
**Extraction Opportunity:**
- `hakmem_tiny_init_env.inc` - 74 lines (env parsing)
- `hakmem_tiny_init_superslab.inc` - 100 lines (SS setup)
- `hakmem_tiny_init_magazine.inc` - 150 lines (mag setup)
- `hakmem_tiny_init_workers.inc` - 126 lines (workers)
- **Total extraction potential: 450 lines → 4 modules**
### 2.2 Lifecycle Management (206 lines, 9%)
**Functions:**
- `hak_tiny_trim()` - 116 lines (1985-2101)
- `tiny_tls_cache_drain()` - 90 lines (2135-2225)
**Purpose:** Memory reclamation, cleanup, trim operations
**Extraction Opportunity:**
- `hakmem_tiny_lifecycle.inc` - 206 lines
- Could include `tiny_apply_mem_diet()` (20 lines) as well
- **Total: 226 lines**
### 2.3 Slab Management (120 lines, 5.3%)
**Functions:**
- `allocate_new_slab()` - 79 lines (1327-1406)
- `release_slab()` - 23 lines (1408-1431)
- `move_to_full_list()` - 20 lines (1479-1499)
- `move_to_free_list()` - 20 lines (1501-1521)
**Extraction Opportunity:**
- `hakmem_tiny_slab_mgmt.inc` - 142 lines
- Or move to `hakmem_tiny_slab.{h,c}` as a proper module (better)
### 2.4 Registry Operations (22 lines, 1%)
**Function:**
- `registry_lookup()` - 22 lines (1303-1325)
**Note:** Already has hakmem_tiny_registry.c/h infrastructure
**Action:** Move this function to hakmem_tiny_registry.c
### 2.5 Hot Path Inline Functions (200+ lines, 9%)
**Per-Class Hot Pop Functions (84 lines):**
- `tiny_hot_pop_class0/1/2/3()` - 21 lines each × 4 = 84 lines
**Extraction Opportunity:**
- These are `always_inline` hot-path functions
- Should extract to `hakmem_tiny_hot_pop.inc.h` (inline header)
- Similar to existing `hakmem_tiny_hotmag.inc.h` pattern
**Fast Path Helpers (100+ lines):**
- `tiny_fast_pop()` - 17 lines (377-394)
- `tiny_fast_push()` - 13 lines (394-407)
- `fastcache_pop()` - 8 lines (873-881)
- `fastcache_push()` - 7 lines (881-888)
- `quick_pop()` - 8 lines (892-900)
**Extraction Opportunity:**
- `hakmem_tiny_fastcache.inc.h` - inline hot-path helpers
### 2.6 Refill Operations (184 lines, 8.2%)
**Functions:**
- `ultra_refill_sll()` - 56 lines (1178-1234)
- `sll_refill_small_from_ss()` - 45 lines (952-997)
- `superslab_tls_bump_fast()` - 45 lines (1016-1061)
- `frontend_refill_fc()` - 44 lines (1063-1107)
- `tiny_fast_refill_and_take()` - 39 lines (584-623)
- `quick_refill_from_sll()` - 18 lines (918-936)
- `quick_refill_from_mag()` - 11 lines (938-949)
- `bulk_mag_to_sll_if_room()` - 22 lines (1133-1155)
**Extraction Opportunity:**
- `hakmem_tiny_refill.inc.h` - 280+ lines
- These are mostly inline functions used in hot paths
- Should be header-based for inlining
### 2.7 TLS Operations and Helpers (100+ lines, 4.5%)
**Functions:**
- `tiny_tls_refresh_params()` - 24 lines (352-376)
- `tiny_tls_bind_slab()` - 7 lines (318-325)
- `tiny_tls_default_refill()` - 7 lines (325-332)
- `tiny_tls_default_spill()` - 8 lines (332-340)
- `tiny_tls_publish_targets()` - 7 lines (340-347)
- `tiny_tls_request_trim()` - 5 lines (347-352)
**Note:** Some of this overlaps with hakmem_tiny_tls_ops.h
**Action:** Consolidate into existing TLS ops module
### 2.8 Miscellaneous Helpers (50+ lines)
**Functions:**
- `tiny_slow_alloc_fast()` - 88 lines (495-583) - COLD PATH
- `tiny_optional_push()` - 27 lines (777-804)
- `hak_tiny_alloc_superslab_try_fast()` - 16 lines (900-916)
- `hak_thread_id16()` - 4 lines (837-841)
- `eventq_push_ex()` - 26 lines (843-869)
- Various small inline helpers
---
## 3. Proposed Modularization Plan
### Phase 1: Initialization Extraction (HIGH PRIORITY)
**Goal:** Extract 450-line `hak_tiny_init()` function
**Strategy A: Multi-file split (Recommended)**
```
core/tiny/init/
hakmem_tiny_init.c - Main init orchestrator (50 lines)
hakmem_tiny_init_env.inc - Environment parsing (74 lines)
hakmem_tiny_init_superslab.inc - SuperSlab setup (100 lines)
hakmem_tiny_init_magazine.inc - Magazine setup (150 lines)
hakmem_tiny_init_workers.inc - Worker spawning (126 lines)
```
**Strategy B: Single large module (Simpler)**
```
core/hakmem_tiny_init.inc - All initialization (450 lines)
```
**Benefit:** Reduces main file by 20%
**Risk:** Low - initialization is cold path, one-time execution
**Priority:** HIGH - largest function
### Phase 2: Lifecycle Management (MEDIUM PRIORITY)
**Goal:** Extract trim and cleanup operations
```
core/hakmem_tiny_lifecycle.inc
- hak_tiny_trim() (116 lines)
- tiny_tls_cache_drain() (90 lines)
- tiny_apply_mem_diet() (20 lines)
Total: 226 lines (10% reduction)
```
**Benefit:** Cleaner separation of concerns
**Risk:** Low - cold path, called rarely
**Priority:** MEDIUM
### Phase 3: Slab Management Module (MEDIUM PRIORITY)
**Goal:** Consolidate slab lifecycle into proper module
**Option A: Keep as .inc**
```
core/hakmem_tiny_slab_mgmt.inc
- allocate_new_slab() (79 lines)
- release_slab() (23 lines)
- move_to_full_list() (20 lines)
- move_to_free_list() (20 lines)
Total: 142 lines (6% reduction)
```
**Option B: Promote to proper module (Recommended)**
```
core/hakmem_tiny_slab.h - Slab API and inline helpers
core/hakmem_tiny_slab.c - Slab management implementation
```
**Benefit:** Better encapsulation, testability
**Risk:** Low-medium - called from multiple paths, need careful header management
**Priority:** MEDIUM
### Phase 4: Hot Path Inline Extraction (HIGH PRIORITY)
**Goal:** Extract inline hot-path functions to headers for readability
**4A: Hot Pop Functions**
```
core/hakmem_tiny_hot_pop.inc.h
- tiny_hot_pop_class0/1/2/3() (84 lines)
```
**4B: Fast Cache Operations**
```
core/hakmem_tiny_fastcache.inc.h
- fastcache_pop/push() (15 lines)
- quick_pop() (8 lines)
- tiny_fast_pop/push() (30 lines)
Total: 53 lines
```
**4C: Refill Operations**
```
core/hakmem_tiny_refill.inc.h
- ultra_refill_sll() (56 lines)
- sll_refill_small_from_ss() (45 lines)
- superslab_tls_bump_fast() (45 lines)
- frontend_refill_fc() (44 lines)
- Other refill helpers (90 lines)
Total: 280 lines (12% reduction)
```
**Benefit:** Maintains performance (inlining), improves readability
**Risk:** LOW - these are already inline functions
**Priority:** HIGH - significant line count reduction (417 lines total)
### Phase 5: Registry Consolidation (LOW PRIORITY)
**Goal:** Move registry_lookup() to existing registry module
```
Move: registry_lookup() (22 lines) → hakmem_tiny_registry.c
```
**Benefit:** Logical grouping, minimal benefit
**Risk:** Very low
**Priority:** LOW - only 22 lines
---
## 4. Proposed Folder Structure
### Option A: Flat with Subdirectories (Recommended)
```
core/
hakmem_tiny.c # Main orchestrator (900 lines after phase 1-4)
hakmem_tiny.h # Main header
# Hot path inline headers (included in tiny.c)
hakmem_tiny_hotmag.inc.h # ✓ Exists (147 lines)
hakmem_tiny_ultra_front.inc.h # ✓ Exists (52 lines)
hakmem_tiny_hot_pop.inc.h # NEW (84 lines) - Phase 4A
hakmem_tiny_fastcache.inc.h # NEW (53 lines) - Phase 4B
hakmem_tiny_refill.inc.h # NEW (280 lines) - Phase 4C
# Backend implementation includes
hakmem_tiny_alloc.inc # ✓ Exists (198 lines)
hakmem_tiny_free.inc # ✓ Exists (814 lines)
hakmem_tiny_intel.inc # ✓ Exists (863 lines)
hakmem_tiny_background.inc # ✓ Exists (261 lines)
hakmem_tiny_slow.inc # ✓ Exists (36 lines)
hakmem_tiny_remote.inc # ✓ Exists (56 lines)
hakmem_tiny_init.inc # NEW (450 lines) - Phase 1
hakmem_tiny_lifecycle.inc # NEW (226 lines) - Phase 2
hakmem_tiny_slab_mgmt.inc # NEW (142 lines) - Phase 3
# Supporting modules (proper .h/.c pairs)
hakmem_tiny_superslab.{h,c} # ✓ Exists
hakmem_tiny_magazine.{h,c} # ✓ Exists
hakmem_tiny_stats.{h,c} # ✓ Exists
hakmem_tiny_tls_list.h # ✓ Exists
hakmem_tiny_slab.{h,c} # NEW - Phase 3 Option B
...
```
### Option B: Hierarchical Subdirectories (Future)
```
core/tiny/
tiny.c # Main file
tiny.h # Main header
frontend/ # Hot path allocation
hot_pop.inc.h
fastcache.inc.h
ultra_front.inc.h
hotmag.inc.h
refill.inc.h
backend/ # Slow path/management
alloc.inc
free.inc
slab_mgmt.inc
lifecycle.inc
init.inc
background.inc
intel.inc
remote.inc
core/ # Core infrastructure
superslab.{h,c}
magazine.{h,c}
slab.{h,c}
tls_list.h
stats.{h,c}
api/ # Public APIs
stats_api.h
query_api.h
registry_api.h
rss_api.h
```
**Recommendation:** Start with Option A (flat), migrate to Option B when module count exceeds 30 files.
---
## 5. Module Boundary Analysis
### 5.1 Natural Module Boundaries
**Frontend (Hot Path - Inline Headers):**
- Ultra-fast tier: Bump allocator, hot magazines
- Fast tier: FastCache, Quick slots
- Per-class specialization: Hot pop functions
- Refill operations: SLL refill, mag refill, SS bump
**Backend (Cold Path - .inc Files):**
- Initialization: Environment, setup, workers
- Lifecycle: Trim, drain, cleanup
- Slab management: Allocation, release, list operations
- Intelligence: Telemetry, events, background workers
- Remote operations: Cross-thread free handling
**Core Infrastructure (Proper Modules):**
- SuperSlab: Large-scale memory management
- Magazine: Per-class caching
- TLS Lists: Thread-local free lists
- Statistics: Performance metrics
**APIs (Small Modules):**
- Query interface
- Stats interface
- Registry interface
### 5.2 Dependency Graph
```
hakmem_tiny.c
├─ [includes frontend inline headers]
│ ├─ hakmem_tiny_hot_pop.inc.h (NEW)
│ ├─ hakmem_tiny_fastcache.inc.h (NEW)
│ ├─ hakmem_tiny_refill.inc.h (NEW)
│ ├─ hakmem_tiny_hotmag.inc.h (existing)
│ └─ hakmem_tiny_ultra_front.inc.h (existing)
├─ [includes backend .inc files]
│ ├─ hakmem_tiny_init.inc (NEW)
│ ├─ hakmem_tiny_lifecycle.inc (NEW)
│ ├─ hakmem_tiny_slab_mgmt.inc (NEW)
│ ├─ hakmem_tiny_alloc.inc (existing)
│ ├─ hakmem_tiny_free.inc (existing)
│ ├─ hakmem_tiny_intel.inc (existing)
│ ├─ hakmem_tiny_background.inc (existing)
│ ├─ hakmem_tiny_slow.inc (existing)
│ └─ hakmem_tiny_remote.inc (existing)
└─ [depends on core modules]
├─ hakmem_tiny_superslab.h/c
├─ hakmem_tiny_magazine.h/c
├─ hakmem_tiny_slab.h/c (NEW)
├─ hakmem_tiny_stats.h/c
└─ hakmem_tiny_tls_list.h
```
---
## 6. Line Count Projections
### Current State
```
hakmem_tiny.c: 2245 lines
```
### After Phase 1 (Init Extraction)
```
hakmem_tiny.c: 1795 lines (-450, -20%)
hakmem_tiny_init.inc: +450 lines
```
### After Phase 2 (Lifecycle)
```
hakmem_tiny.c: 1569 lines (-226, -10% additional)
hakmem_tiny_lifecycle.inc: +226 lines
```
### After Phase 3 (Slab Management)
```
hakmem_tiny.c: 1427 lines (-142, -6% additional)
hakmem_tiny_slab_mgmt.inc: +142 lines
```
### After Phase 4 (Hot Path Inline)
```
hakmem_tiny.c: 1010 lines (-417, -18% additional)
hakmem_tiny_hot_pop.inc.h: +84 lines
hakmem_tiny_fastcache.inc.h: +53 lines
hakmem_tiny_refill.inc.h: +280 lines
```
### Final Result After All Phases
```
hakmem_tiny.c: ~1010 lines (55% reduction from 2245)
```
**Remaining in main file:**
- Core allocation/free orchestration logic
- Global state declarations
- Wrapper integration
- Forward declarations
- Helper macros
---
## 7. Benefits and Risks
### Benefits
**Maintainability:**
- Easier to locate and modify specific functionality
- Reduced cognitive load (1000-line files vs 2200-line files)
- Clear separation of hot path vs cold path
**Performance:**
- No degradation expected - inline functions stay inline
- Cold path extractions have zero performance impact
- Compiler still sees all code after #include
**Testability:**
- Modules can be tested in isolation (with proper mocking)
- Easier to benchmark specific subsystems
**Documentation:**
- Each module can have focused documentation
- Clearer API boundaries
### Risks
**Compilation:**
- Increased include complexity
- Potential circular dependency issues (mitigated by careful ordering)
- Build time may increase slightly (more files to parse)
**Debugging:**
- Stack traces may show file:line from .inc files
- Need to ensure debug info includes correct file paths
- (Risk is minimal - modern debuggers handle this well)
**Refactoring Overhead:**
- Need to move forward declarations carefully
- May expose hidden dependencies
- Requires thorough testing after extraction
**Cognitive Overhead:**
- Developers need to know which file contains what
- Could make code harder to follow if module boundaries are unclear
- (Mitigated by clear naming conventions and documentation)
---
## 8. Priority Ranking for Next Phases
### PRIORITY 1: Hot Path Inline Extraction (Phase 4)
**Why:** High impact (417 lines), low risk, maintains performance
**When:** Immediately
**Effort:** 2-3 hours
**Files:**
- hakmem_tiny_hot_pop.inc.h (84 lines)
- hakmem_tiny_fastcache.inc.h (53 lines)
- hakmem_tiny_refill.inc.h (280 lines)
### PRIORITY 2: Initialization Extraction (Phase 1)
**Why:** Largest function (450 lines), cold path, clear boundary
**When:** After Phase 4
**Effort:** 3-4 hours
**Files:**
- hakmem_tiny_init.inc (450 lines)
- OR split into 4 sub-modules (init_env, init_superslab, init_magazine, init_workers)
### PRIORITY 3: Lifecycle Management (Phase 2)
**Why:** Good size reduction (226 lines), clean separation
**When:** After Phase 1
**Effort:** 2 hours
**Files:**
- hakmem_tiny_lifecycle.inc (226 lines)
### PRIORITY 4: Slab Management (Phase 3)
**Why:** Logical grouping, moderate size (142 lines)
**When:** After Phase 2
**Effort:** 2-3 hours
**Files:**
- hakmem_tiny_slab_mgmt.inc OR hakmem_tiny_slab.{h,c}
### PRIORITY 5: Registry Consolidation (Phase 5)
**Why:** Small cleanup, logical grouping
**When:** Any time
**Effort:** 15 minutes
**Files:**
- Move registry_lookup() to hakmem_tiny_registry.c
---
## 9. Recommended Action Plan
### Week 1: Hot Path Inline Extraction
```bash
# Create new inline header files
touch core/hakmem_tiny_hot_pop.inc.h
touch core/hakmem_tiny_fastcache.inc.h
touch core/hakmem_tiny_refill.inc.h
# Extract functions (use sed/awk scripts)
# Add #include statements to hakmem_tiny.c
# Compile and test
# Verify performance (run benchmarks)
```
### Week 2: Initialization Extraction
```bash
# Create init module
touch core/hakmem_tiny_init.inc
# Extract hak_tiny_init() function
# Add #include at appropriate location
# Test initialization path thoroughly
```
### Week 3: Lifecycle and Slab Management
```bash
# Create lifecycle module
touch core/hakmem_tiny_lifecycle.inc
# Create slab management module
touch core/hakmem_tiny_slab_mgmt.inc
# Extract functions
# Compile and test
```
### Week 4: Testing and Documentation
```bash
# Run full benchmark suite
# Update documentation
# Create module dependency diagram
# Write migration guide
```
---
## 10. Success Metrics
### Quantitative
- [ ] hakmem_tiny.c reduced below 1200 lines (46% reduction)
- [ ] No performance regression in hot benchmarks (< 2% variance)
- [ ] All tests pass
- [ ] Compilation time increase < 10%
### Qualitative
- [ ] Code is easier to navigate and understand
- [ ] Module boundaries are clear and logical
- [ ] Documentation accurately reflects new structure
- [ ] Team members can easily locate functionality
---
## Appendix A: Full File Inventory
```
Current tiny-related files (31 files):
Headers (inline/interface):
hakmem_tiny.h (327 lines)
hakmem_tiny_superslab.h (215 lines)
hakmem_tiny_magazine.h (45 lines)
hakmem_tiny_batch_refill.h (232 lines)
hakmem_tiny_stats.h (277 lines)
hakmem_tiny_stats_api.h (23 lines)
hakmem_tiny_query_api.h (18 lines)
hakmem_tiny_rss_api.h (9 lines)
hakmem_tiny_registry_api.h (32 lines)
hakmem_tiny_tls_list.h (131 lines)
hakmem_tiny_remote_target.h (25 lines)
hakmem_tiny_bg_spill.h (52 lines)
hakmem_tiny_mini_mag.h (148 lines)
hakmem_tiny_tls_ops.h (251 lines)
Inline implementation headers (.inc.h):
hakmem_tiny_hotmag.inc.h (147 lines)
hakmem_tiny_ultra_front.inc.h (52 lines)
hakmem_tiny_bg_bin.inc.h (37 lines)
Include-only backend modules (.inc):
hakmem_tiny_intel.inc (863 lines)
hakmem_tiny_free.inc (814 lines)
hakmem_tiny_background.inc (261 lines)
hakmem_tiny_alloc.inc (198 lines)
hakmem_tiny_remote.inc (56 lines)
hakmem_tiny_slow.inc (36 lines)
Implementation files (.c):
hakmem_tiny.c (2245 lines) ← MAIN FILE
hakmem_tiny_superslab.c (484 lines)
hakmem_tiny_magazine.c (144 lines)
hakmem_tiny_stats.c (251 lines)
hakmem_tiny_rss.c (28 lines)
hakmem_tiny_query.c (72 lines)
hakmem_tiny_registry.c (63 lines)
hakmem_tiny_remote_target.c (40 lines)
hakmem_tiny_bg_spill.c (83 lines)
TOTAL: ~8,700 lines across 31 files
MAIN: 2,245 lines (26% of total)
```
---
## Appendix B: Extraction Script Templates
### B.1 Extract Function to .inc File
```bash
#!/bin/bash
# extract_function.sh <source_file> <function_name> <target_inc>
SOURCE="$1"
FUNCTION="$2"
TARGET="$3"
# Find function start and end lines
START=$(grep -n "^${FUNCTION}(" "$SOURCE" | cut -d: -f1)
# Find matching closing brace (simple version - may need improvement)
END=$(awk "NR>=$START && /^}$/ {print NR; exit}" "$SOURCE")
# Extract function
sed -n "${START},${END}p" "$SOURCE" > "$TARGET"
# Remove from source (leave comment)
sed -i "${START},${END}c\\
// EXTRACTED TO $TARGET\\
// See $TARGET for implementation
" "$SOURCE"
echo "Extracted $FUNCTION ($((END-START+1)) lines) to $TARGET"
```
### B.2 Create Inline Header Template
```bash
#!/bin/bash
# create_inline_header.sh <module_name>
MODULE="$1"
HEADER="hakmem_tiny_${MODULE}.inc.h"
cat > "core/$HEADER" << 'EOF'
#ifndef HAKMEM_TINY_${MODULE^^}_INC_H
#define HAKMEM_TINY_${MODULE^^}_INC_H
// Module: ${MODULE}
// Purpose: [Description]
// Type: Inline hot-path functions
// Phase: [Phase number]
// Forward declarations (if needed)
// Inline function implementations
#endif // HAKMEM_TINY_${MODULE^^}_INC_H
EOF
echo "Created core/$HEADER"
```
---
## Appendix C: Performance Validation Checklist
After each extraction phase, run:
```bash
# 1. Compilation check
make clean && make
# 2. Unit tests
make test
# 3. Hot-path benchmarks
./bench_tiny_hot_hakmi
./bench_tiny_hot_mi
./bench_random_mixed_hakmi
./bench_random_mixed_mi
# 4. Memory efficiency
./scripts/run_memory_efficiency.sh
# 5. Full benchmark suite
./scripts/run_bench_suite.sh
# 6. Verify no regressions
# Compare results with baseline (before extraction)
```
---
END OF REPORT