Files
hakmem/core/tiny_route.h
Moe Charm (CI) acc64f2438 Phase ML1: Pool v1 memset 89.73% overhead 軽量化 (+15.34% improvement)
## Summary
- ChatGPT により bench_profile.h の setenv segfault を修正(RTLD_NEXT 経由に切り替え)
- core/box/pool_zero_mode_box.h 新設:ENV キャッシュ経由で ZERO_MODE を統一管理
- core/hakmem_pool.c で zero mode に応じた memset 制御(FULL/header/off)
- A/B テスト結果:ZERO_MODE=header で +15.34% improvement(1M iterations, C6-heavy)

## Files Modified
- core/box/pool_api.inc.h: pool_zero_mode_box.h include
- core/bench_profile.h: glibc setenv → malloc+putenv(segfault 回避)
- core/hakmem_pool.c: zero mode 参照・制御ロジック
- core/box/pool_zero_mode_box.h (新設): enum/getter
- CURRENT_TASK.md: Phase ML1 結果記載

## Test Results
| Iterations | ZERO_MODE=full | ZERO_MODE=header | Improvement |
|-----------|----------------|-----------------|------------|
| 10K       | 3.06 M ops/s   | 3.17 M ops/s    | +3.65%     |
| 1M        | 23.71 M ops/s  | 27.34 M ops/s   | **+15.34%** |

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-10 09:08:18 +09:00

85 lines
3.0 KiB
C

// tiny_route.h - Route Fingerprint (Box-boundary tracing, ultra-light)
#pragma once
#include <stdint.h>
#include <stdlib.h>
#include <stdatomic.h>
#include "tiny_debug_ring.h"
// Bits (keep <= 63 to stay in one 64-bit word)
// 0: refill_enter
// 1/2: ready_try/ready_hit
// 3/4: mail_try/mail_hit
// 5/6: sticky_try/sticky_hit
// 7/8: hot_try/hot_hit
// 9/10: bench_try/bench_hit
// 11/12: reg_try/reg_hit
// 13/14: adopt_try/adopt_hit
// 15: mmap_path
// 16: free_enter
// 17: free_same_thread
// 18: free_remote_transition
// 19: first_free_transition
// 20: mailbox_publish
static __thread uint64_t g_route_fp __attribute__((unused));
static __thread uint32_t g_route_seq __attribute__((unused));
static __thread int g_route_active __attribute__((unused));
static int g_route_enable_env = -1;
static int g_route_sample_lg = -1;
static inline int route_enabled_runtime(void) {
if (__builtin_expect(g_route_enable_env == -1, 0)) {
const char* e = getenv("HAKMEM_ROUTE");
g_route_enable_env = (e && *e && *e != '0') ? 1 : 0;
}
return g_route_enable_env;
}
static inline uint32_t route_sample_mask(void) {
if (__builtin_expect(g_route_sample_lg == -1, 0)) {
const char* e = getenv("HAKMEM_ROUTE_SAMPLE_LG");
int lg = (e && *e) ? atoi(e) : 10; // 1/1024 既定
if (lg < 0) lg = 0;
if (lg > 24) lg = 24;
g_route_sample_lg = lg;
}
return (g_route_sample_lg >= 31) ? 0xFFFFFFFFu : ((1u << g_route_sample_lg) - 1u);
}
#if HAKMEM_BUILD_RELEASE && !HAKMEM_ROUTE
#define ROUTE_BEGIN(cls) do { (void)(cls); } while(0)
#define ROUTE_MARK(bit) do { (void)(bit); } while(0)
#define ROUTE_COMMIT(cls, tag) do { (void)(cls); (void)(tag); } while(0)
static inline void route_free_commit(int class_idx, uint64_t bits, uint16_t tag) {
(void)class_idx; (void)bits; (void)tag;
}
#else
#define ROUTE_BEGIN(cls) do { \
if (__builtin_expect(!route_enabled_runtime(), 1)) { g_route_active = 0; break; } \
uint32_t m = route_sample_mask(); \
uint32_t s = ++g_route_seq; \
g_route_active = ((s & m) == 0u); \
g_route_fp = 0ull; \
(void)(cls); \
} while(0)
#define ROUTE_MARK(bit) do { if (__builtin_expect(g_route_active, 0)) { g_route_fp |= (1ull << (bit)); } } while(0)
#define ROUTE_COMMIT(cls, tag) do { \
if (__builtin_expect(g_route_active, 0)) { \
uintptr_t aux = ((uintptr_t)(tag & 0xFFFF) << 48) | (uintptr_t)(g_route_fp & 0x0000FFFFFFFFFFFFull); \
tiny_debug_ring_record(TINY_RING_EVENT_ROUTE, (uint16_t)(cls), (void*)(uintptr_t)g_route_fp, aux); \
g_route_active = 0; \
} \
} while(0)
static inline void route_free_commit(int class_idx, uint64_t bits, uint16_t tag) {
if (!route_enabled_runtime()) return;
uintptr_t aux = ((uintptr_t)(tag & 0xFFFF) << 48) | (uintptr_t)(bits & 0x0000FFFFFFFFFFFFull);
tiny_debug_ring_record(TINY_RING_EVENT_ROUTE, (uint16_t)class_idx, (void*)(uintptr_t)bits, aux);
}
#endif
// Note: Build-time gate removed to keep integration simple; runtime env controls activation.