Просмотр исходного кода

Unlink server sessions from multi-wait when service stops processing requests (#7072)

gdkchan 1 год назад
Родитель
Сommit
ce09450743

+ 2 - 0
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>();

+ 3 - 0
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();

+ 13 - 0
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()