Stage MC-0c: shared VM code made per-VM or atomic (FABRIC-3.10.8 §3.4)

- Dictionary lookup index is per VM (vm->fc_index, struct SfFcIndex):
  was one global index rebuilt whenever a different VM was searched, and
  heat reorganization could reorder another VM's buckets. Allocated on
  first lookup, freed by vm_cleanup(); allocation failure counted/logged,
  lookup falls back to a newest-first dictionary walk.
- PRNG: still one stream, stepped by compare-and-swap; SEED one store.
- state_variable removed (write-only; STATE is vm->mode).
- Sweep additions (Captain Bob's ruling): heartbeat_export.c delta
  last-values moved into each VM's HeartbeatState (were statics shared by
  every VM -- wrong across VMs today); TOP-WORDS list heap-sized per call
  (was static [1000]); inference_outputs_to_string() takes a caller
  buffer; three failure counters atomic; crc64 table published with
  release/acquire.
- Confirmed, unchanged: g_runtime compiled out of the kernel,
  g_hotwords_cache unreferenced, ttf cache core-0-only.
- Probe (removed): every VM has its own index; two VMs searched
  alternately 2x5000 lookups: 0 rebuilds, 0 wrong-VM results, all three
  ISAs.
- Standard sequence on amd64/aarch64/riscv64: dict_hash set unchanged,
  G byte-identical, MINT/WIREBIND/USE ok, conservation true, 0 idle growth.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Robert Allan James
2026-09-25 21:05:20 -04:00
co-authored by Claude Opus 5.5
parent 33f4090d6d
commit 355909d46f
28 changed files with 55241 additions and 125 deletions
+26 -6
View File
@@ -92,15 +92,35 @@ DictEntry *dict_find_word_heat_aware(VM *vm, const char *name, size_t len);
*/
void dict_adaptive_optimization_pass(VM *vm);
/* Frequency-class (fc) buckets — shared between dictionary_management.c and
dictionary_heat_optimization.c. Declared here once to give LTO a single
canonical type definition and avoid -Werror=lto-type-mismatch. */
/* First-character (fc) lookup index — shared between dictionary_management.c
and dictionary_heat_optimization.c. Declared here once to give LTO a single
canonical type definition and avoid -Werror=lto-type-mismatch.
FABRIC-3.10.8 Stage MC-0c: one index per VM (vm->fc_index), not one for
the whole system. The old global index held whichever VM's dictionary was
searched last, so alternating between two VMs rebuilt it on every switch,
and a heat reorganization could reorder another VM's buckets. SF_FC_BUCKETS
is one bucket per possible first byte, the whole domain, not a capacity. */
#ifndef SF_FC_BUCKETS
#define SF_FC_BUCKETS 256
#endif
extern DictEntry **sf_fc_list[SF_FC_BUCKETS];
extern size_t sf_fc_count[SF_FC_BUCKETS];
extern size_t sf_fc_cap[SF_FC_BUCKETS];
struct SfFcIndex {
DictEntry **list[SF_FC_BUCKETS]; /* per bucket: entries, [0]=oldest */
size_t count[SF_FC_BUCKETS];
size_t cap[SF_FC_BUCKETS];
DictEntry *cached_latest; /* the vm->latest this index reflects */
uint64_t rebuilds; /* full rebuilds of this index, ever */
};
/* This VM's index, allocated on first use; NULL only if that allocation
failed (counted and logged -- lookups then walk the dictionary). */
struct SfFcIndex *vm_dictionary_index(VM *vm);
/* Frees vm's index (vm_cleanup()). */
void vm_dictionary_index_free(VM *vm);
/* Index allocations refused for lack of memory, system-wide. */
uint32_t vm_dictionary_index_alloc_failures(void);
#endif /* DICTIONARY_HEAT_OPTIMIZATION_H */