fix(simulation): address #843 review — seeding, atomics, API consistency
Review fixes from Hoshe + Tyre: - EntityRng seeding: splitmix64(seed) ^ splitmix64(id) instead of splitmix64(seed + id) — eliminates collision class where adjacent seeds produce identical streams - AtomicBool ordering: Relaxed → SeqCst for shutdown flag (correct on weakly-ordered architectures) - Worker Drop: join handles instead of detaching threads - Normalize stub API: remove ChunkGenWorker convenience wrappers, use .pool consistently across all 3 workers - trigger_monologue: downgrade &mut to shared refs (no-op anchor was blocking parallel systems) - Remove dead SimRng inserts from migrated monologue tests - Document determinism gap on poll_worker_results - Document bevy_tasks/rayon dep rationale in Cargo.toml Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -12,16 +12,25 @@ use super::stubs::{ChunkGenWorker, NpcPrepWorker, OffscreenTickWorker};
|
||||
|
||||
/// PreInput: poll all worker pools for completed results.
|
||||
///
|
||||
/// Incorporates results into the world state. Currently logs completions
|
||||
/// at debug level — real incorporation logic (spawning chunks, activating
|
||||
/// NPCs) plugs in at Phase 5+.
|
||||
/// Currently logs completions at debug level — real incorporation logic
|
||||
/// (spawning chunks, activating NPCs) plugs in at Phase 5+.
|
||||
///
|
||||
/// **DETERMINISM GAP (D-010):** Results are incorporated at the tick they
|
||||
/// happen to be ready, not at a deterministic tick. Two runs with the same
|
||||
/// seed may incorporate a chunk at tick 500 vs tick 502 depending on CPU
|
||||
/// load — diverging world state from that point.
|
||||
///
|
||||
/// This is acceptable while all handlers are no-ops (no simulation state
|
||||
/// is modified). Before any handler produces real state changes, implement
|
||||
/// a `WorkerResultLog` resource that records `(tick, worker_type, result)`.
|
||||
/// Replay reads from the log instead of polling channels. See plan #843.
|
||||
pub fn poll_worker_results(
|
||||
chunk_worker: Option<Res<ChunkGenWorker>>,
|
||||
npc_worker: Option<Res<NpcPrepWorker>>,
|
||||
offscreen_worker: Option<Res<OffscreenTickWorker>>,
|
||||
) {
|
||||
if let Some(worker) = chunk_worker {
|
||||
for (result, _strategy) in worker.drain() {
|
||||
for (result, _strategy) in worker.pool.drain() {
|
||||
tracing::debug!(
|
||||
chunk_x = result.chunk_x,
|
||||
chunk_y = result.chunk_y,
|
||||
|
||||
Reference in New Issue
Block a user