// smallsegment_v6_box.h - SmallSegment v6 型定義(Phase v6-2) #ifndef HAKMEM_SMALLSEGMENT_V6_BOX_H #define HAKMEM_SMALLSEGMENT_V6_BOX_H #include // 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 // C4 configuration (Phase v6-6) #define SMALL_V6_C4_CLASS_IDX 4 #define SMALL_V6_C4_BLOCK_SIZE 128 // 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