Major Features: - Debug counter infrastructure for Refill Stage tracking - Free Pipeline counters (ss_local, ss_remote, tls_sll) - Diagnostic counters for early return analysis - Unified larson.sh benchmark runner with profiles - Phase 6-3 regression analysis documentation Bug Fixes: - Fix SuperSlab disabled by default (HAKMEM_TINY_USE_SUPERSLAB) - Fix profile variable naming consistency - Add .gitignore patterns for large files Performance: - Phase 6-3: 4.79 M ops/s (has OOM risk) - With SuperSlab: 3.13 M ops/s (+19% improvement) This is a clean repository without large log files. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
768 lines
22 KiB
Markdown
768 lines
22 KiB
Markdown
# 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
|