diff options
author | gdkchan <gab.dark.100@gmail.com> | 2024-07-20 16:17:40 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-20 16:17:40 -0300 |
commit | ce09450743ad36f6478af1a21b5fbff283f08e59 (patch) | |
tree | 2bcd14bc6fe4f9163fd761f32e7993780017f965 | |
parent | 2cb80f37d42261bb583e518eb729b62a442cdb15 (diff) |
Unlink server sessions from multi-wait when service stops processing requests (#7072)1.1.1355
-rw-r--r-- | src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs | 2 | ||||
-rw-r--r-- | src/Ryujinx.Horizon/Sdk/OsTypes/MultiWait.cs | 3 | ||||
-rw-r--r-- | src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs | 13 |
3 files changed, 18 insertions, 0 deletions
diff --git a/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs b/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs index 2aefb0db5..406352003 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 | |||
21 | 21 | ||
22 | public long CurrentTime { get; private set; } | 22 | public long CurrentTime { get; private set; } |
23 | 23 | ||
24 | public IEnumerable<MultiWaitHolderBase> MultiWaits => _multiWaits; | ||
25 | |||
24 | public MultiWaitImpl() | 26 | public MultiWaitImpl() |
25 | { | 27 | { |
26 | _multiWaits = new List<MultiWaitHolderBase>(); | 28 | _multiWaits = new List<MultiWaitHolderBase>(); |
diff --git a/src/Ryujinx.Horizon/Sdk/OsTypes/MultiWait.cs b/src/Ryujinx.Horizon/Sdk/OsTypes/MultiWait.cs index 0e73e3f88..41d17802a 100644 --- a/src/Ryujinx.Horizon/Sdk/OsTypes/MultiWait.cs +++ b/src/Ryujinx.Horizon/Sdk/OsTypes/MultiWait.cs | |||
@@ -1,4 +1,5 @@ | |||
1 | using Ryujinx.Horizon.Sdk.OsTypes.Impl; | 1 | using Ryujinx.Horizon.Sdk.OsTypes.Impl; |
2 | using System.Collections.Generic; | ||
2 | 3 | ||
3 | namespace Ryujinx.Horizon.Sdk.OsTypes | 4 | namespace Ryujinx.Horizon.Sdk.OsTypes |
4 | { | 5 | { |
@@ -6,6 +7,8 @@ namespace Ryujinx.Horizon.Sdk.OsTypes | |||
6 | { | 7 | { |
7 | private readonly MultiWaitImpl _impl; | 8 | private readonly MultiWaitImpl _impl; |
8 | 9 | ||
10 | public IEnumerable<MultiWaitHolderBase> MultiWaits => _impl.MultiWaits; | ||
11 | |||
9 | public MultiWait() | 12 | public MultiWait() |
10 | { | 13 | { |
11 | _impl = new MultiWaitImpl(); | 14 | _impl = new MultiWaitImpl(); |
diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs index 9886e1cbf..570e3c802 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; | |||
3 | using Ryujinx.Horizon.Sdk.Sf.Cmif; | 3 | using Ryujinx.Horizon.Sdk.Sf.Cmif; |
4 | using Ryujinx.Horizon.Sdk.Sm; | 4 | using Ryujinx.Horizon.Sdk.Sm; |
5 | using System; | 5 | using System; |
6 | using System.Linq; | ||
6 | 7 | ||
7 | namespace Ryujinx.Horizon.Sdk.Sf.Hipc | 8 | namespace Ryujinx.Horizon.Sdk.Sf.Hipc |
8 | { | 9 | { |
@@ -116,6 +117,18 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc | |||
116 | while (WaitAndProcessRequestsImpl()) | 117 | while (WaitAndProcessRequestsImpl()) |
117 | { | 118 | { |
118 | } | 119 | } |
120 | |||
121 | // Unlink pending sessions, dispose expects them to be already unlinked. | ||
122 | |||
123 | ServerSession[] serverSessions = Enumerable.OfType<ServerSession>(_multiWait.MultiWaits).ToArray(); | ||
124 | |||
125 | foreach (ServerSession serverSession in serverSessions) | ||
126 | { | ||
127 | if (serverSession.IsLinked) | ||
128 | { | ||
129 | serverSession.UnlinkFromMultiWaitHolder(); | ||
130 | } | ||
131 | } | ||
119 | } | 132 | } |
120 | 133 | ||
121 | public void WaitAndProcessRequests() | 134 | public void WaitAndProcessRequests() |