05ac804e6c
BroadcastIfChanged computed the snapshot under inventoryAccess and published it under broadcastAccess as two separate steps, so two racing broadcasts could publish in the opposite order they computed, locking a stale snapshot in as the authoritative state seeded to new subscribers. Compute, publish, and subscriber enqueue now happen in one broadcastAccess critical section (enqueue is a non-blocking send).