From ce09450743ad36f6478af1a21b5fbff283f08e59 Mon Sep 17 00:00:00 2001
From: gdkchan <gab.dark.100@gmail.com>
Date: Sat, 20 Jul 2024 16:17:40 -0300
Subject: [PATCH] Unlink server sessions from multi-wait when service stops
 processing requests (#7072)

---
 .../Sdk/OsTypes/Impl/MultiWaitImpl.cs               |  2 ++
 src/Ryujinx.Horizon/Sdk/OsTypes/MultiWait.cs        |  3 +++
 .../Sdk/Sf/Hipc/ServerManagerBase.cs                | 13 +++++++++++++
 3 files changed, 18 insertions(+)

diff --git a/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs b/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs
index 2aefb0db..40635200 100644
--- a/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs
+++ b/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs
@@ -21,6 +21,8 @@ namespace Ryujinx.Horizon.Sdk.OsTypes.Impl
 
         public long CurrentTime { get; private set; }
 
+        public IEnumerable<MultiWaitHolderBase> MultiWaits => _multiWaits;
+
         public MultiWaitImpl()
         {
             _multiWaits = new List<MultiWaitHolderBase>();
diff --git a/src/Ryujinx.Horizon/Sdk/OsTypes/MultiWait.cs b/src/Ryujinx.Horizon/Sdk/OsTypes/MultiWait.cs
index 0e73e3f8..41d17802 100644
--- a/src/Ryujinx.Horizon/Sdk/OsTypes/MultiWait.cs
+++ b/src/Ryujinx.Horizon/Sdk/OsTypes/MultiWait.cs
@@ -1,4 +1,5 @@
 using Ryujinx.Horizon.Sdk.OsTypes.Impl;
+using System.Collections.Generic;
 
 namespace Ryujinx.Horizon.Sdk.OsTypes
 {
@@ -6,6 +7,8 @@ namespace Ryujinx.Horizon.Sdk.OsTypes
     {
         private readonly MultiWaitImpl _impl;
 
+        public IEnumerable<MultiWaitHolderBase> MultiWaits => _impl.MultiWaits;
+
         public MultiWait()
         {
             _impl = new MultiWaitImpl();
diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs
index 9886e1cb..570e3c80 100644
--- a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs
+++ b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs
@@ -3,6 +3,7 @@ using Ryujinx.Horizon.Sdk.OsTypes;
 using Ryujinx.Horizon.Sdk.Sf.Cmif;
 using Ryujinx.Horizon.Sdk.Sm;
 using System;
+using System.Linq;
 
 namespace Ryujinx.Horizon.Sdk.Sf.Hipc
 {
@@ -116,6 +117,18 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
             while (WaitAndProcessRequestsImpl())
             {
             }
+
+            // Unlink pending sessions, dispose expects them to be already unlinked.
+
+            ServerSession[] serverSessions = Enumerable.OfType<ServerSession>(_multiWait.MultiWaits).ToArray();
+
+            foreach (ServerSession serverSession in serverSessions)
+            {
+                if (serverSession.IsLinked)
+                {
+                    serverSession.UnlinkFromMultiWaitHolder();
+                }
+            }
         }
 
         public void WaitAndProcessRequests()