2025-11-05 12:31:14 +09:00
|
|
|
// hakmem_config.c - Mode-based Configuration Implementation
|
|
|
|
|
|
|
|
|
|
#include "hakmem_config.h"
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.h>
|
2025-11-11 01:47:06 +09:00
|
|
|
#include "hakmem_internal.h" // HAKMEM_LOG for release-silent logging
|
2025-11-05 12:31:14 +09:00
|
|
|
|
|
|
|
|
// ===========================================================================
|
|
|
|
|
// Global Configuration Instance
|
|
|
|
|
// ===========================================================================
|
|
|
|
|
|
|
|
|
|
HakemConfig g_hakem_config = {0};
|
|
|
|
|
|
|
|
|
|
// ===========================================================================
|
|
|
|
|
// Mode Names
|
|
|
|
|
// ===========================================================================
|
|
|
|
|
|
|
|
|
|
const char* hak_mode_name(HakemMode mode) {
|
|
|
|
|
switch (mode) {
|
|
|
|
|
case HAKMEM_MODE_MINIMAL: return "minimal";
|
|
|
|
|
case HAKMEM_MODE_FAST: return "fast";
|
|
|
|
|
case HAKMEM_MODE_BALANCED: return "balanced";
|
|
|
|
|
case HAKMEM_MODE_LEARNING: return "learning";
|
|
|
|
|
case HAKMEM_MODE_RESEARCH: return "research";
|
|
|
|
|
default: return "unknown";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ===========================================================================
|
|
|
|
|
// Mode Presets
|
|
|
|
|
// ===========================================================================
|
|
|
|
|
|
|
|
|
|
static void apply_minimal_mode(HakemConfig* cfg) {
|
|
|
|
|
cfg->mode = HAKMEM_MODE_MINIMAL;
|
|
|
|
|
cfg->mode_name = "minimal";
|
|
|
|
|
|
|
|
|
|
// Features: ALL OFF (baseline)
|
|
|
|
|
cfg->features.alloc = HAKMEM_FEATURE_MALLOC | HAKMEM_FEATURE_MMAP;
|
|
|
|
|
cfg->features.cache = 0; // No BigCache
|
|
|
|
|
cfg->features.learning = 0; // No ELO/Evolution
|
|
|
|
|
cfg->features.memory = 0; // No Batch/THP/FreePo licy
|
|
|
|
|
cfg->features.debug = 0; // No debug logging
|
|
|
|
|
|
|
|
|
|
// Policies
|
|
|
|
|
cfg->free_policy = FREE_POLICY_BATCH; // Default (but batch disabled)
|
|
|
|
|
cfg->thp_policy = THP_POLICY_OFF;
|
|
|
|
|
cfg->evo_phase = EVO_PHASE_FROZEN; // Not used (ELO disabled)
|
|
|
|
|
|
|
|
|
|
// Parameters
|
|
|
|
|
cfg->elo_frozen_strategy = 4; // 2MB threshold (not used)
|
|
|
|
|
cfg->batch_threshold = 2097152; // 2MB
|
|
|
|
|
|
|
|
|
|
// Debug
|
|
|
|
|
cfg->verbose = 0;
|
2025-12-01 16:37:59 +09:00
|
|
|
cfg->ace_trace = 0;
|
2025-11-05 12:31:14 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void apply_fast_mode(HakemConfig* cfg) {
|
|
|
|
|
cfg->mode = HAKMEM_MODE_FAST;
|
|
|
|
|
cfg->mode_name = "fast";
|
|
|
|
|
|
|
|
|
|
// Features: Pool fast-path + FROZEN learning
|
|
|
|
|
cfg->features.alloc = HAKMEM_FEATURE_MALLOC | HAKMEM_FEATURE_MMAP | HAKMEM_FEATURE_POOL;
|
|
|
|
|
cfg->features.cache = HAKMEM_FEATURE_BIGCACHE | HAKMEM_FEATURE_TINYPOOL;
|
|
|
|
|
cfg->features.learning = HAKMEM_FEATURE_ELO; // FROZEN only
|
|
|
|
|
cfg->features.memory = HAKMEM_FEATURE_BATCH_MADVISE | HAKMEM_FEATURE_FREE_POLICY;
|
|
|
|
|
cfg->features.debug = 0;
|
|
|
|
|
|
|
|
|
|
// Policies
|
|
|
|
|
cfg->free_policy = FREE_POLICY_ADAPTIVE;
|
|
|
|
|
cfg->thp_policy = THP_POLICY_AUTO;
|
|
|
|
|
cfg->evo_phase = EVO_PHASE_FROZEN; // FROZEN: no learning overhead
|
|
|
|
|
|
|
|
|
|
// Parameters
|
|
|
|
|
cfg->elo_frozen_strategy = 4; // 2MB threshold (confirmed by learning)
|
|
|
|
|
cfg->batch_threshold = 2097152; // 2MB
|
|
|
|
|
|
|
|
|
|
// Debug
|
|
|
|
|
cfg->verbose = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void apply_balanced_mode(HakemConfig* cfg) {
|
|
|
|
|
cfg->mode = HAKMEM_MODE_BALANCED;
|
|
|
|
|
cfg->mode_name = "balanced";
|
|
|
|
|
|
|
|
|
|
// Features: L2 Pool + BigCache + ELO FROZEN + Batch (Phase 6.9)
|
|
|
|
|
cfg->features.alloc = HAKMEM_FEATURE_MALLOC | HAKMEM_FEATURE_MMAP | HAKMEM_FEATURE_POOL;
|
|
|
|
|
cfg->features.cache = HAKMEM_FEATURE_BIGCACHE;
|
|
|
|
|
cfg->features.learning = HAKMEM_FEATURE_ELO; // FROZEN only
|
|
|
|
|
cfg->features.memory = HAKMEM_FEATURE_BATCH_MADVISE | HAKMEM_FEATURE_FREE_POLICY;
|
|
|
|
|
cfg->features.debug = 0;
|
|
|
|
|
|
|
|
|
|
// Policies
|
|
|
|
|
cfg->free_policy = FREE_POLICY_ADAPTIVE;
|
|
|
|
|
cfg->thp_policy = THP_POLICY_AUTO;
|
|
|
|
|
cfg->evo_phase = EVO_PHASE_FROZEN;
|
|
|
|
|
|
|
|
|
|
// Parameters
|
|
|
|
|
cfg->elo_frozen_strategy = 4; // 2MB threshold
|
|
|
|
|
cfg->batch_threshold = 2097152; // 2MB
|
|
|
|
|
|
|
|
|
|
// Debug
|
|
|
|
|
cfg->verbose = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void apply_learning_mode(HakemConfig* cfg) {
|
|
|
|
|
cfg->mode = HAKMEM_MODE_LEARNING;
|
|
|
|
|
cfg->mode_name = "learning";
|
|
|
|
|
|
|
|
|
|
// Features: BigCache + ELO LEARN + Batch
|
|
|
|
|
cfg->features.alloc = HAKMEM_FEATURE_MALLOC | HAKMEM_FEATURE_MMAP;
|
|
|
|
|
cfg->features.cache = HAKMEM_FEATURE_BIGCACHE;
|
|
|
|
|
cfg->features.learning = HAKMEM_FEATURE_ELO | HAKMEM_FEATURE_EVOLUTION | HAKMEM_FEATURE_PROFILING;
|
|
|
|
|
cfg->features.memory = HAKMEM_FEATURE_BATCH_MADVISE | HAKMEM_FEATURE_FREE_POLICY;
|
|
|
|
|
cfg->features.debug = HAKMEM_FEATURE_STATISTICS; // Minimal debug
|
|
|
|
|
|
|
|
|
|
// Policies
|
|
|
|
|
cfg->free_policy = FREE_POLICY_ADAPTIVE;
|
|
|
|
|
cfg->thp_policy = THP_POLICY_AUTO;
|
|
|
|
|
cfg->evo_phase = EVO_PHASE_LEARN; // LEARN → FROZEN transition
|
|
|
|
|
|
|
|
|
|
// Parameters
|
|
|
|
|
cfg->elo_frozen_strategy = 4; // Initial guess (will be learned)
|
|
|
|
|
cfg->batch_threshold = 2097152; // 2MB
|
|
|
|
|
|
|
|
|
|
// Debug
|
|
|
|
|
cfg->verbose = 1; // Minimal logging
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void apply_research_mode(HakemConfig* cfg) {
|
|
|
|
|
cfg->mode = HAKMEM_MODE_RESEARCH;
|
|
|
|
|
cfg->mode_name = "research";
|
|
|
|
|
|
|
|
|
|
// Features: ALL ON
|
|
|
|
|
cfg->features.alloc = HAKMEM_FEATURE_MALLOC | HAKMEM_FEATURE_MMAP;
|
|
|
|
|
cfg->features.cache = HAKMEM_FEATURE_BIGCACHE;
|
|
|
|
|
cfg->features.learning = HAKMEM_FEATURE_ELO | HAKMEM_FEATURE_EVOLUTION | HAKMEM_FEATURE_PROFILING;
|
|
|
|
|
cfg->features.memory = HAKMEM_FEATURE_BATCH_MADVISE | HAKMEM_FEATURE_THP | HAKMEM_FEATURE_FREE_POLICY;
|
|
|
|
|
cfg->features.debug = HAKMEM_FEATURE_DEBUG_LOG | HAKMEM_FEATURE_STATISTICS | HAKMEM_FEATURE_TRACE;
|
|
|
|
|
|
|
|
|
|
// Policies
|
|
|
|
|
cfg->free_policy = FREE_POLICY_ADAPTIVE;
|
|
|
|
|
cfg->thp_policy = THP_POLICY_ON; // Force THP
|
|
|
|
|
cfg->evo_phase = EVO_PHASE_LEARN;
|
|
|
|
|
|
|
|
|
|
// Parameters
|
|
|
|
|
cfg->elo_frozen_strategy = 4;
|
|
|
|
|
cfg->batch_threshold = 2097152;
|
|
|
|
|
|
|
|
|
|
// Debug
|
|
|
|
|
cfg->verbose = 2; // Verbose logging
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void hak_config_apply_mode(HakemMode mode) {
|
|
|
|
|
switch (mode) {
|
|
|
|
|
case HAKMEM_MODE_MINIMAL: apply_minimal_mode(&g_hakem_config); break;
|
|
|
|
|
case HAKMEM_MODE_FAST: apply_fast_mode(&g_hakem_config); break;
|
|
|
|
|
case HAKMEM_MODE_BALANCED: apply_balanced_mode(&g_hakem_config); break;
|
|
|
|
|
case HAKMEM_MODE_LEARNING: apply_learning_mode(&g_hakem_config); break;
|
|
|
|
|
case HAKMEM_MODE_RESEARCH: apply_research_mode(&g_hakem_config); break;
|
|
|
|
|
default:
|
2025-11-11 01:47:06 +09:00
|
|
|
HAKMEM_LOG("Unknown mode %d, using BALANCED\n", mode);
|
2025-11-05 12:31:14 +09:00
|
|
|
apply_balanced_mode(&g_hakem_config);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ===========================================================================
|
|
|
|
|
// Environment Variable Parsing
|
|
|
|
|
// ===========================================================================
|
|
|
|
|
|
|
|
|
|
static HakemMode parse_mode_env(const char* mode_str) {
|
|
|
|
|
if (!mode_str) return HAKMEM_MODE_BALANCED; // Default
|
|
|
|
|
|
|
|
|
|
if (strcmp(mode_str, "minimal") == 0) return HAKMEM_MODE_MINIMAL;
|
|
|
|
|
if (strcmp(mode_str, "fast") == 0) return HAKMEM_MODE_FAST;
|
|
|
|
|
if (strcmp(mode_str, "balanced") == 0) return HAKMEM_MODE_BALANCED;
|
|
|
|
|
if (strcmp(mode_str, "learning") == 0) return HAKMEM_MODE_LEARNING;
|
|
|
|
|
if (strcmp(mode_str, "research") == 0) return HAKMEM_MODE_RESEARCH;
|
|
|
|
|
|
2025-11-11 01:47:06 +09:00
|
|
|
HAKMEM_LOG("Unknown HAKMEM_MODE='%s', using balanced\n", mode_str);
|
2025-11-05 12:31:14 +09:00
|
|
|
return HAKMEM_MODE_BALANCED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void apply_individual_env_overrides(void) {
|
|
|
|
|
// Allow individual env vars to override mode presets
|
|
|
|
|
const char* free_policy_env = getenv("HAKMEM_FREE_POLICY");
|
|
|
|
|
if (free_policy_env) {
|
|
|
|
|
if (strcmp(free_policy_env, "batch") == 0) {
|
|
|
|
|
g_hakem_config.free_policy = FREE_POLICY_BATCH;
|
|
|
|
|
} else if (strcmp(free_policy_env, "keep") == 0) {
|
|
|
|
|
g_hakem_config.free_policy = FREE_POLICY_KEEP;
|
|
|
|
|
} else if (strcmp(free_policy_env, "adaptive") == 0) {
|
|
|
|
|
g_hakem_config.free_policy = FREE_POLICY_ADAPTIVE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char* thp_env = getenv("HAKMEM_THP");
|
|
|
|
|
if (thp_env) {
|
|
|
|
|
if (strcmp(thp_env, "off") == 0) {
|
|
|
|
|
g_hakem_config.thp_policy = THP_POLICY_OFF;
|
|
|
|
|
} else if (strcmp(thp_env, "auto") == 0) {
|
|
|
|
|
g_hakem_config.thp_policy = THP_POLICY_AUTO;
|
|
|
|
|
} else if (strcmp(thp_env, "on") == 0) {
|
|
|
|
|
g_hakem_config.thp_policy = THP_POLICY_ON;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char* verbose_env = getenv("HAKMEM_VERBOSE");
|
|
|
|
|
if (verbose_env) {
|
|
|
|
|
g_hakem_config.verbose = atoi(verbose_env);
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-01 16:37:59 +09:00
|
|
|
const char* ace_trace_env = getenv("HAKMEM_ACE_TRACE");
|
|
|
|
|
if (ace_trace_env) {
|
|
|
|
|
g_hakem_config.ace_trace = atoi(ace_trace_env);
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-05 12:31:14 +09:00
|
|
|
// Individual feature toggles (override mode presets)
|
|
|
|
|
const char* disable_bigcache = getenv("HAKMEM_DISABLE_BIGCACHE");
|
|
|
|
|
if (disable_bigcache && atoi(disable_bigcache)) {
|
|
|
|
|
g_hakem_config.features.cache &= ~HAKMEM_FEATURE_BIGCACHE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char* disable_elo = getenv("HAKMEM_DISABLE_ELO");
|
|
|
|
|
if (disable_elo && atoi(disable_elo)) {
|
|
|
|
|
g_hakem_config.features.learning &= ~HAKMEM_FEATURE_ELO;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char* disable_batch = getenv("HAKMEM_DISABLE_BATCH");
|
|
|
|
|
if (disable_batch && atoi(disable_batch)) {
|
|
|
|
|
g_hakem_config.features.memory &= ~HAKMEM_FEATURE_BATCH_MADVISE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void hak_config_init(void) {
|
|
|
|
|
// Step 1: Check HAKMEM_MODE (highest priority)
|
|
|
|
|
const char* mode_env = getenv("HAKMEM_MODE");
|
|
|
|
|
HakemMode mode = parse_mode_env(mode_env);
|
|
|
|
|
hak_config_apply_mode(mode);
|
|
|
|
|
|
|
|
|
|
// Step 2: Apply individual env var overrides
|
|
|
|
|
apply_individual_env_overrides();
|
|
|
|
|
|
|
|
|
|
// Step 3: Print configuration (if verbose)
|
|
|
|
|
if (g_hakem_config.verbose >= 1) {
|
|
|
|
|
hak_config_print();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ===========================================================================
|
|
|
|
|
// Debug Printing
|
|
|
|
|
// ===========================================================================
|
|
|
|
|
|
|
|
|
|
void hak_config_print(void) {
|
2025-11-11 01:47:06 +09:00
|
|
|
HAKMEM_LOG("\n========================================\n");
|
|
|
|
|
HAKMEM_LOG("hakmem Configuration\n");
|
|
|
|
|
HAKMEM_LOG("========================================\n");
|
|
|
|
|
HAKMEM_LOG("Mode: %s\n", g_hakem_config.mode_name);
|
|
|
|
|
HAKMEM_LOG("\n");
|
|
|
|
|
|
|
|
|
|
HAKMEM_LOG("Features:\n");
|
|
|
|
|
HAKMEM_LOG(" Allocation:\n");
|
|
|
|
|
HAKMEM_LOG(" malloc: %s\n", (g_hakem_config.features.alloc & HAKMEM_FEATURE_MALLOC) ? "ON" : "OFF");
|
|
|
|
|
HAKMEM_LOG(" mmap: %s\n", (g_hakem_config.features.alloc & HAKMEM_FEATURE_MMAP) ? "ON" : "OFF");
|
|
|
|
|
HAKMEM_LOG(" pool: %s\n", (g_hakem_config.features.alloc & HAKMEM_FEATURE_POOL) ? "ON" : "OFF");
|
|
|
|
|
|
|
|
|
|
HAKMEM_LOG(" Caching:\n");
|
|
|
|
|
HAKMEM_LOG(" BigCache: %s\n", (g_hakem_config.features.cache & HAKMEM_FEATURE_BIGCACHE) ? "ON" : "OFF");
|
|
|
|
|
HAKMEM_LOG(" TinyPool: %s\n", (g_hakem_config.features.cache & HAKMEM_FEATURE_TINYPOOL) ? "ON" : "OFF");
|
|
|
|
|
|
|
|
|
|
HAKMEM_LOG(" Learning:\n");
|
|
|
|
|
HAKMEM_LOG(" ELO: %s\n", (g_hakem_config.features.learning & HAKMEM_FEATURE_ELO) ? "ON" : "OFF");
|
|
|
|
|
HAKMEM_LOG(" Evolution: %s\n", (g_hakem_config.features.learning & HAKMEM_FEATURE_EVOLUTION) ? "ON" : "OFF");
|
|
|
|
|
HAKMEM_LOG(" Profiling: %s\n", (g_hakem_config.features.learning & HAKMEM_FEATURE_PROFILING) ? "ON" : "OFF");
|
|
|
|
|
|
|
|
|
|
HAKMEM_LOG(" Memory:\n");
|
|
|
|
|
HAKMEM_LOG(" Batch madvise: %s\n", (g_hakem_config.features.memory & HAKMEM_FEATURE_BATCH_MADVISE) ? "ON" : "OFF");
|
|
|
|
|
HAKMEM_LOG(" THP: %s\n", (g_hakem_config.features.memory & HAKMEM_FEATURE_THP) ? "ON" : "OFF");
|
|
|
|
|
HAKMEM_LOG(" Free policy: %s\n", (g_hakem_config.features.memory & HAKMEM_FEATURE_FREE_POLICY) ? "ON" : "OFF");
|
|
|
|
|
|
|
|
|
|
HAKMEM_LOG(" Debug:\n");
|
|
|
|
|
HAKMEM_LOG(" Logging: %s\n", (g_hakem_config.features.debug & HAKMEM_FEATURE_DEBUG_LOG) ? "ON" : "OFF");
|
|
|
|
|
HAKMEM_LOG(" Statistics: %s\n", (g_hakem_config.features.debug & HAKMEM_FEATURE_STATISTICS) ? "ON" : "OFF");
|
|
|
|
|
HAKMEM_LOG(" Trace: %s\n", (g_hakem_config.features.debug & HAKMEM_FEATURE_TRACE) ? "ON" : "OFF");
|
2025-12-01 16:37:59 +09:00
|
|
|
HAKMEM_LOG(" ACE Trace: %s\n", g_hakem_config.ace_trace ? "ON" : "OFF");
|
2025-11-11 01:47:06 +09:00
|
|
|
|
|
|
|
|
HAKMEM_LOG("\n");
|
|
|
|
|
HAKMEM_LOG("Policies:\n");
|
|
|
|
|
HAKMEM_LOG(" Free policy: %s\n",
|
2025-11-05 12:31:14 +09:00
|
|
|
g_hakem_config.free_policy == FREE_POLICY_BATCH ? "batch" :
|
|
|
|
|
g_hakem_config.free_policy == FREE_POLICY_KEEP ? "keep" :
|
|
|
|
|
g_hakem_config.free_policy == FREE_POLICY_ADAPTIVE ? "adaptive" : "unknown");
|
2025-11-11 01:47:06 +09:00
|
|
|
HAKMEM_LOG(" THP policy: %s\n",
|
2025-11-05 12:31:14 +09:00
|
|
|
g_hakem_config.thp_policy == THP_POLICY_OFF ? "off" :
|
|
|
|
|
g_hakem_config.thp_policy == THP_POLICY_AUTO ? "auto" :
|
|
|
|
|
g_hakem_config.thp_policy == THP_POLICY_ON ? "on" : "unknown");
|
2025-11-11 01:47:06 +09:00
|
|
|
HAKMEM_LOG(" Evo phase: %s\n",
|
2025-11-05 12:31:14 +09:00
|
|
|
g_hakem_config.evo_phase == EVO_PHASE_LEARN ? "learn" :
|
|
|
|
|
g_hakem_config.evo_phase == EVO_PHASE_FROZEN ? "frozen" :
|
|
|
|
|
g_hakem_config.evo_phase == EVO_PHASE_CANARY ? "canary" : "unknown");
|
|
|
|
|
|
2025-11-11 01:47:06 +09:00
|
|
|
HAKMEM_LOG("\n");
|
|
|
|
|
HAKMEM_LOG("Parameters:\n");
|
|
|
|
|
HAKMEM_LOG(" ELO frozen strategy: %d\n", g_hakem_config.elo_frozen_strategy);
|
|
|
|
|
HAKMEM_LOG(" Batch threshold: %zu bytes\n", g_hakem_config.batch_threshold);
|
|
|
|
|
HAKMEM_LOG(" Verbose level: %d\n", g_hakem_config.verbose);
|
|
|
|
|
HAKMEM_LOG("========================================\n\n");
|
2025-11-05 12:31:14 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ===========================================================================
|
|
|
|
|
// Feature Helper (for hakmem_features.h)
|
|
|
|
|
// ===========================================================================
|
|
|
|
|
|
|
|
|
|
HakemFeatureSet hak_features_for_mode(const char* mode_str) {
|
|
|
|
|
HakemMode mode = parse_mode_env(mode_str);
|
|
|
|
|
HakemConfig temp_cfg;
|
|
|
|
|
memset(&temp_cfg, 0, sizeof(temp_cfg));
|
|
|
|
|
|
|
|
|
|
switch (mode) {
|
|
|
|
|
case HAKMEM_MODE_MINIMAL: apply_minimal_mode(&temp_cfg); break;
|
|
|
|
|
case HAKMEM_MODE_FAST: apply_fast_mode(&temp_cfg); break;
|
|
|
|
|
case HAKMEM_MODE_BALANCED: apply_balanced_mode(&temp_cfg); break;
|
|
|
|
|
case HAKMEM_MODE_LEARNING: apply_learning_mode(&temp_cfg); break;
|
|
|
|
|
case HAKMEM_MODE_RESEARCH: apply_research_mode(&temp_cfg); break;
|
|
|
|
|
default: apply_balanced_mode(&temp_cfg); break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return temp_cfg.features;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void hak_features_print(HakemFeatureSet* fs) {
|
2025-11-11 01:47:06 +09:00
|
|
|
HAKMEM_LOG("Feature Set:\n");
|
|
|
|
|
HAKMEM_LOG(" alloc: 0x%08x\n", fs->alloc);
|
|
|
|
|
HAKMEM_LOG(" cache: 0x%08x\n", fs->cache);
|
|
|
|
|
HAKMEM_LOG(" learning: 0x%08x\n", fs->learning);
|
|
|
|
|
HAKMEM_LOG(" memory: 0x%08x\n", fs->memory);
|
|
|
|
|
HAKMEM_LOG(" debug: 0x%08x\n", fs->debug);
|
2025-11-05 12:31:14 +09:00
|
|
|
}
|
|
|
|
|
// Box Refactor line default: enable SuperSlab unless explicitly disabled by env or diet mode
|
|
|
|
|
int g_use_superslab = 1;
|