diff --git a/streaming-agent/signaling-server.js b/streaming-agent/signaling-server.js index 72583ba..c4cc981 100644 --- a/streaming-agent/signaling-server.js +++ b/streaming-agent/signaling-server.js @@ -252,17 +252,29 @@ function performCssRestart(reason) { containerRestarting = true; broadcastQueueState(); + // Use Wine's own proper teardown instead of pkill + a fixed sleep guess. + // `wineserver -k` signals every Wine process under this prefix to exit; + // `wineserver -w` BLOCKS until wineserver has actually fully released all + // its shared memory / locks / sockets, rather than gambling on a fixed + // delay being long enough. This is what previously let a fresh CSS + // instance start before the old one had genuinely finished tearing down, + // inheriting a wedged state and landing right back on the same stuck + // "Connecting to server..." screen even after repeated restarts. + // Wrapped in `timeout` so a manual restart can never hang indefinitely if + // wineserver somehow never exits — after 15s we give up waiting and + // proceed to relaunch anyway. try { - execSync(`docker exec ${CONTAINER} pkill -f "cstrike_win64.exe" || true`); - execSync(`docker exec ${CONTAINER} pkill -f "revLoader.exe" || true`); - execSync(`docker exec ${CONTAINER} pkill -f "wineserver" || true`); - execSync(`docker exec ${CONTAINER} pkill -f "winedevice.exe" || true`); - console.log('[sig] CSS restart: processes killed'); + execSync(`docker exec ${CONTAINER} bash -c "wineserver -k; timeout 15 wineserver -w || true"`); + console.log('[sig] CSS restart: wineserver fully torn down'); } catch (e) { - console.error('[sig] CSS restart: failed to kill CSS:', e.message); + console.error('[sig] CSS restart: wineserver teardown failed:', e.message); } - setTimeout(() => { + // No artificial delay needed here anymore — wineserver -w above already + // blocked until teardown was genuinely complete (or the 15s timeout was + // hit), so we can relaunch immediately rather than adding another + // arbitrary fixed wait on top of a real synchronization guarantee. + (() => { try { execSync(`docker exec -d ${CONTAINER} bash -c "DISPLAY=:99 wine '/home/ubuntu/Counter-Strike Source/revLoader.exe'"`); console.log('[sig] CSS restart: relaunched'); @@ -290,7 +302,7 @@ function performCssRestart(reason) { console.error('[sig] CSS restart: failed to focus new window:', e.message); } }, 8000); - }, 2000); + })(); } // Periodic restart: controller handoffs no longer restart the game at all,