mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-09-03 03:05:18 +02:00
The WebSocket thread holds lifecycleLock across a whole event handler, and handlers do their real work through Core_RunOnCPUThread(), which blocks until the CPU thread drains the queue. Meanwhile PSP_Shutdown() -> Core_NotifyLifecycle(STOPPING) took that same lock on the CPU thread. So the debugger thread waited for the CPU thread while the CPU thread waited for the lock the debugger thread was holding, and neither ever moved. Drain the CPU queue while waiting for the lock instead of blocking on it. Core state is still alive at STOPPING (it's notified before CPU_Shutdown), so running those queued callbacks then is safe, and it lets the debugger thread finish and release the lock. Verified with a temporary instrumented build - a 3s sleep inside a handler while holding lifecycleLock, arranged to overlap the game's shutdown - which hangs reliably on the old code and exits cleanly with this change. lifecycleLock stays for now: roughly half the subscribers and all the broadcasters still read core state directly on the WebSocket thread instead of going through the queue, and this is what keeps that from racing with teardown. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GZq8ZtJmFY7bkX5FVkr3P9