64697f917e
The event queue's heap seq was the last GC'd block surviving across rounds: each round runs on a freshly spawned bot thread, so the N+1 thread realloc'd a block grown by dead thread N's allocator mid-round (at the next capacity doubling, ~turn 104) -> rawDealloc SIGSEGV in addEvent (7 gdb-confirmed coredumps). Replace with a static array[MAX_QUEUE_SIZE, BotEvent] + eventsLen: no heap block crosses threads, realloc can never happen. Also fix the harness aborting the final round mid-train: PPO_Bot's onRoundEnded trains synchronously after the runner's RoundEndedEvent, so the counter read right after awaitResults() is the stale pre-train value and System.exit killed the bot inside ppoUpdate. Poll up to 60s for the counter to catch up before declaring the battle incomplete. Verified: 72 consecutive rounds vs Fire, 100% wins, all rounds trained (counter advanced 1:1), zero coredumps since the fix.
14 lines
733 B
Nim
14 lines
733 B
Nim
# Static-link OpenBLAS for portable deployment
|
|
# ponytail: adjust path per machine, or use pkg-config
|
|
switch("passL", "-L/nix/store/v07svn2y92bvzjl51aj7c9ca1cwg7rw7-openblas-0.3.32/lib -lopenblas")
|
|
switch("threads", "on")
|
|
# begin Nimble config (version 2)
|
|
when withDir(thisDir(), system.fileExists("nimble.paths")):
|
|
include "nimble.paths"
|
|
# end Nimble config
|
|
# Use the repo-vendored Tank Royale bot API (libs/) instead of the nimble pkg.
|
|
# The pkg copy lived in ~/.nimble/pkgs2 and was patched ad-hoc; vendoring makes
|
|
# the build self-contained and keeps the cross-thread Channel fix in-tree.
|
|
# Must come AFTER the nimble.paths include: later --path wins the import search.
|
|
switch("path", thisDir() & "/../libs/tankroyale_botapi")
|