Extend v6 architecture to support C5 (129-256B) in addition to C6 (257-512B): - SmallHeapCtxV6: Add tls_freelist_c5[32] and tls_count_c5 for C5 TLS cache - smallsegment_v6_box.h: Add SMALL_V6_C5_CLASS_IDX (5) and C5_BLOCK_SIZE (256) - smallobject_cold_iface_v6.c: Generalize refill_page for both C5 (256 blocks/page) and C6 (128 blocks/page) - smallobject_core_v6.c: Add C5 fast path (alloc/free) with TLS batching Performance (v6 C5 enabled): - C5-heavy: 41.0M ops/s (-23% vs v6 OFF 53.6M) - needs optimization - Mixed: 36.2M ops/s (-18% vs v6 OFF 44.0M) - functional baseline Note: C5 route requires optimization in next phase to match v6-3 performance. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
78 lines
2.9 KiB
C
78 lines
2.9 KiB
C
// 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
|
||
|
||
// C5 configuration (Phase v6-5)
|
||
#define SMALL_V6_C5_CLASS_IDX 5
|
||
#define SMALL_V6_C5_BLOCK_SIZE 256
|
||
|
||
// 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
|