Files
hakmem/core/box/smallsegment_v6_box.h
Moe Charm (CI) c60199182e Phase v6-1/2/3/4: SmallObject Core v6 - C6-only implementation + refactor
Phase v6-1: C6-only route stub (v1/pool fallback)
Phase v6-2: Segment v6 + ColdIface v6 + Core v6 HotPath implementation
  - 2MiB segment / 64KiB page allocation
  - O(1) ptr→page_meta lookup with segment masking
  - C6-heavy A/B: SEGV-free but -44% performance (15.3M ops/s)

Phase v6-3: Thin-layer optimization (TLS ownership check + batch header + refill batching)
  - TLS ownership fast-path skip page_meta for 90%+ of frees
  - Batch header writes during refill (32 allocs = 1 header write)
  - TLS batch refill (1/32 refill frequency)
  - C6-heavy A/B: v6-2 15.3M → v6-3 27.1M ops/s (±0% vs baseline) 

Phase v6-4: Mixed hang fix (segment metadata lookup correction)
  - Root cause: metadata lookup was reading mmap region instead of TLS slot
  - Fix: use TLS slot descriptor with in_use validation
  - Mixed health: 5M iterations SEGV-free, 35.8M ops/s 

Phase v6-refactor: Code quality improvements (macro unification + inline + docs)
  - Add SMALL_V6_* prefix macros (header, pointer conversion, page index)
  - Extract inline validation functions (small_page_v6_valid, small_ptr_in_segment_v6)
  - Doxygen-style comments for all public functions
  - Result: 0 compiler warnings, maintained +1.2% performance

Files:
- core/box/smallobject_core_v6_box.h (new, type & API definitions)
- core/box/smallobject_cold_iface_v6.h (new, cold iface API)
- core/box/smallsegment_v6_box.h (new, segment type definitions)
- core/smallobject_core_v6.c (new, C6 alloc/free implementation)
- core/smallobject_cold_iface_v6.c (new, refill/retire logic)
- core/smallsegment_v6.c (new, segment allocator)
- docs/analysis/SMALLOBJECT_CORE_V6_DESIGN.md (new, design document)
- core/box/tiny_route_env_box.h (modified, v6 route added)
- core/front/malloc_tiny_fast.h (modified, v6 case in route switch)
- Makefile (modified, v6 objects added)
- CURRENT_TASK.md (modified, v6 status added)

Status:
- C6-heavy: v6 OFF 27.1M → v6-3 ON 27.1M ops/s (±0%) 
- Mixed: v6 ON 35.8M ops/s (C6-only, other classes via v1) 
- Build: 0 warnings, fully documented 

🤖 Generated with Claude Code

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-11 15:29:59 +09:00

74 lines
2.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// smallsegment_v6_box.h - SmallSegment v6 型定義Phase v6-2
#ifndef HAKMEM_SMALLSEGMENT_V6_BOX_H
#define HAKMEM_SMALLSEGMENT_V6_BOX_H
#include <stdint.h>
// Segment constants
#define SMALL_SEGMENT_V6_SIZE (2 * 1024 * 1024) // 2 MiB
#define SMALL_PAGE_V6_SIZE (64 * 1024) // 64 KiB
#define SMALL_PAGES_PER_SEGMENT (SMALL_SEGMENT_V6_SIZE / SMALL_PAGE_V6_SIZE) // 32
#define SMALL_SEGMENT_V6_MAGIC 0xC06E56u // C0(re) v6
#define SMALL_PAGE_V6_SHIFT 16 // log2(64KiB)
// C6 configuration
#define SMALL_V6_C6_CLASS_IDX 6
#define SMALL_V6_C6_BLOCK_SIZE 512
// Page index calculation macro (requires 'seg' variable in scope)
#define SMALL_V6_PAGE_IDX(seg, addr) (((uintptr_t)(addr) - (seg)->base) >> SMALL_PAGE_V6_SHIFT)
// Forward declaration
typedef struct SmallPageMetaV6 SmallPageMetaV6;
// Page metadata
typedef struct SmallPageMetaV6 {
void* free_list; // freelist head (block先頭をnextとして使う)
uint16_t used; // 現在使用中スロット数
uint16_t capacity; // ページ内スロット数
uint8_t class_idx; // サイズクラス
uint8_t flags; // FULL / PARTIAL / REMOTE_PENDING など
uint16_t page_idx; // Segment 内 index
void* segment; // SmallSegmentV6* への backpointer
} SmallPageMetaV6;
// Segment structure
typedef struct SmallSegmentV6 {
uintptr_t base; // Segment base address
uint32_t num_pages; // Number of pages (typically 32)
uint32_t owner_tid; // Owner thread ID
uint32_t magic; // 0xC0REV6 for validation
SmallPageMetaV6 page_meta[SMALL_PAGES_PER_SEGMENT];
} SmallSegmentV6;
// ============================================================================
// Inline Helper Functions
// ============================================================================
/// Check if page is valid and active
static inline int small_page_v6_valid(SmallPageMetaV6* page) {
return page != NULL && page->capacity > 0;
}
/// Check if pointer is within segment bounds
static inline int small_ptr_in_segment_v6(SmallSegmentV6* seg, void* ptr) {
uintptr_t addr = (uintptr_t)ptr;
return addr >= seg->base && addr < seg->base + SMALL_SEGMENT_V6_SIZE;
}
/// Check if segment is valid and initialized
static inline int small_segment_v6_valid(SmallSegmentV6* seg) {
return seg != NULL && seg->magic == SMALL_SEGMENT_V6_MAGIC;
}
// ============================================================================
// API
// ============================================================================
SmallSegmentV6* small_segment_v6_acquire_for_thread(void);
void small_segment_v6_release(SmallSegmentV6* seg);
SmallPageMetaV6* small_page_meta_v6_of(void* ptr);
#endif // HAKMEM_SMALLSEGMENT_V6_BOX_H