From f1c225fccc66f2c929076d2bc212805a55674172 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 5 Jan 2023 08:05:25 -0600 Subject: [PATCH] Terminate Sunshine if a session doesn't terminate for more than 10 seconds (#707) --- src/stream.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/stream.cpp b/src/stream.cpp index f567c4cf..6b470ddb 100644 --- a/src/stream.cpp +++ b/src/stream.cpp @@ -1359,6 +1359,20 @@ void stop(session_t &session) { } void join(session_t &session) { + // Current Nvidia drivers have a bug where NVENC can deadlock the encoder thread with hardware-accelerated + // GPU scheduling enabled. If this happens, we will terminate ourselves and the service can restart. + // The alternative is that Sunshine can never start another session until it's manually restarted. + auto task = []() { + BOOST_LOG(fatal) << "Hang detected! Session failed to terminate in 10 seconds."sv; + log_flush(); + std::abort(); + }; + auto force_kill = task_pool.pushDelayed(task, 10s).task_id; + auto fg = util::fail_guard([&force_kill]() { + // Cancel the kill task if we manage to return from this function + task_pool.cancel(force_kill); + }); + BOOST_LOG(debug) << "Waiting for video to end..."sv; session.videoThread.join(); BOOST_LOG(debug) << "Waiting for audio to end..."sv;