mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-09-01 02:05:21 +02:00
GameBroadcaster and SteppingBroadcaster ran per connection on the WebSocket thread, so every connected debugger was reading pc, the tick count, coreState, the UI state and the param SFO out from under the CPU thread on every lap of its loop - up to 1000 times a second in high-activity mode. Inverted: the CPU thread notices the transition once in WebSocketDebuggerTick(), formats the event there, and drops it into a per-connection mailbox that the connection's own thread drains and sends. Same events, same conditions, no core reads off the CPU thread, and no per-connection polling of emulator state. The tick hangs off Core_ProcessCPUQueue(), the one function reliably called on the CPU thread both in game (Core_RunLoopUntil) and at the menu (NativeFrame). It polls even with nothing connected, since skipping would let the "previous state" go stale and fire a bogus event at whoever connects next. Behavior preserved including the awkward bit: a debugger that connects while the CPU is already stopped still gets an immediate cpu.stepping, which used to fall out of SteppingBroadcaster's counter starting at 0. That's now an explicit per-connection prime instead of an accident. Part of removing the WebSocket debugger's lifecycleLock. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GZq8ZtJmFY7bkX5FVkr3P9