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>
81 lines
4.5 KiB
C
81 lines
4.5 KiB
C
#ifndef TINY_REMOTE_H
|
|
#define TINY_REMOTE_H
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
|
|
struct SuperSlab;
|
|
struct TinySlabMeta;
|
|
extern int g_remote_side_enable;
|
|
void tiny_remote_side_init_from_env(void);
|
|
void tiny_remote_side_set(struct SuperSlab* ss, int slab_idx, void* node, uintptr_t next);
|
|
uintptr_t tiny_remote_side_get(struct SuperSlab* ss, int slab_idx, void* node);
|
|
void tiny_remote_side_clear(struct SuperSlab* ss, int slab_idx, void* node);
|
|
int tiny_remote_side_contains(struct SuperSlab* ss, int slab_idx, void* node);
|
|
void tiny_remote_sentinel_set(void* node);
|
|
int tiny_remote_sentinel_ok(void* node);
|
|
void tiny_remote_watch_mark(void* node, const char* stage, uint32_t tid);
|
|
int tiny_remote_watch_is(void* node);
|
|
void tiny_remote_watch_clear(void* node);
|
|
void tiny_remote_watch_note(const char* stage, struct SuperSlab* ss, int slab_idx,
|
|
void* node, uint32_t code, uint32_t tid, int fatal);
|
|
#ifdef __GNUC__
|
|
#include <inttypes.h>
|
|
#endif
|
|
#define TINY_REMOTE_SENTINEL ((uintptr_t)0xBADA55BADA55BADAULL)
|
|
|
|
static inline uintptr_t tiny_remote_pack_diag(uint32_t code, uintptr_t base, size_t ss_size, uintptr_t ptr) {
|
|
uintptr_t aux = (uintptr_t)code;
|
|
uint32_t slab = 0xFFFFu;
|
|
uintptr_t low = ptr & 0xFFFFu;
|
|
if (ptr >= base && ptr < base + ss_size) {
|
|
uintptr_t delta = ptr - base;
|
|
slab = (uint32_t)(delta >> 16);
|
|
low = delta & 0xFFFFu;
|
|
}
|
|
aux |= ((uintptr_t)low << 16);
|
|
aux |= ((uintptr_t)slab << 32);
|
|
return aux;
|
|
}
|
|
|
|
void tiny_remote_report_corruption(const char* stage, void* node, uintptr_t observed);
|
|
|
|
#if !defined(HAKMEM_BUILD_RELEASE)
|
|
enum tiny_remote_track_state {
|
|
TINY_REMOTE_TRACK_NONE = 0,
|
|
TINY_REMOTE_TRACK_ALLOC = 1,
|
|
TINY_REMOTE_TRACK_REMOTE = 2,
|
|
TINY_REMOTE_TRACK_FREELIST = 3,
|
|
};
|
|
|
|
void tiny_remote_track_on_alloc(struct SuperSlab* ss, int slab_idx, void* node, const char* stage, uint32_t tid);
|
|
void tiny_remote_track_on_remote_push(struct SuperSlab* ss, int slab_idx, void* node, const char* stage, uint32_t tid);
|
|
void tiny_remote_track_on_remote_drain(struct SuperSlab* ss, int slab_idx, void* node, const char* stage, uint32_t tid);
|
|
void tiny_remote_track_on_local_free(struct SuperSlab* ss, int slab_idx, void* node, const char* stage, uint32_t tid);
|
|
void tiny_remote_track_expect_alloc(struct SuperSlab* ss, int slab_idx, void* node, const char* stage, uint32_t tid);
|
|
void tiny_remote_assert_not_remote(struct SuperSlab* ss, int slab_idx, void* node, const char* stage, uint32_t tid);
|
|
int tiny_remote_guard_allow_local_push(struct SuperSlab* ss,
|
|
int slab_idx,
|
|
struct TinySlabMeta* meta,
|
|
void* node,
|
|
const char* stage,
|
|
uint32_t self_tid);
|
|
#else
|
|
static inline void tiny_remote_track_on_alloc(struct SuperSlab* ss, int slab_idx, void* node, const char* stage, uint32_t tid) { (void)ss; (void)slab_idx; (void)node; (void)stage; (void)tid; }
|
|
static inline void tiny_remote_track_on_remote_push(struct SuperSlab* ss, int slab_idx, void* node, const char* stage, uint32_t tid) { (void)ss; (void)slab_idx; (void)node; (void)stage; (void)tid; }
|
|
static inline void tiny_remote_track_on_remote_drain(struct SuperSlab* ss, int slab_idx, void* node, const char* stage, uint32_t tid) { (void)ss; (void)slab_idx; (void)node; (void)stage; (void)tid; }
|
|
static inline void tiny_remote_track_on_local_free(struct SuperSlab* ss, int slab_idx, void* node, const char* stage, uint32_t tid) { (void)ss; (void)slab_idx; (void)node; (void)stage; (void)tid; }
|
|
static inline void tiny_remote_track_expect_alloc(struct SuperSlab* ss, int slab_idx, void* node, const char* stage, uint32_t tid) { (void)ss; (void)slab_idx; (void)node; (void)stage; (void)tid; }
|
|
static inline void tiny_remote_assert_not_remote(struct SuperSlab* ss, int slab_idx, void* node, const char* stage, uint32_t tid) { (void)ss; (void)slab_idx; (void)node; (void)stage; (void)tid; }
|
|
static inline int tiny_remote_guard_allow_local_push(struct SuperSlab* ss,
|
|
int slab_idx,
|
|
struct TinySlabMeta* meta,
|
|
void* node,
|
|
const char* stage,
|
|
uint32_t self_tid) {
|
|
(void)ss; (void)slab_idx; (void)meta; (void)node; (void)stage; (void)self_tid; return 1;
|
|
}
|
|
#endif
|
|
|
|
#endif
|