aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Ryujinx.HLE/HOS/Services/ServerBase.cs22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/Ryujinx.HLE/HOS/Services/ServerBase.cs b/src/Ryujinx.HLE/HOS/Services/ServerBase.cs
index e892d6ab..b484a768 100644
--- a/src/Ryujinx.HLE/HOS/Services/ServerBase.cs
+++ b/src/Ryujinx.HLE/HOS/Services/ServerBase.cs
@@ -287,6 +287,10 @@ namespace Ryujinx.HLE.HOS.Services
_wakeEvent.WritableEvent.Clear();
}
}
+ else if (rc == KernelResult.PortRemoteClosed && signaledIndex >= 0)
+ {
+ DestroySession(handles[signaledIndex]);
+ }
_selfProcess.CpuMemory.Write(messagePtr + 0x0, 0);
_selfProcess.CpuMemory.Write(messagePtr + 0x4, 2 << 10);
@@ -299,6 +303,16 @@ namespace Ryujinx.HLE.HOS.Services
Dispose();
}
+ private void DestroySession(int serverSessionHandle)
+ {
+ _context.Syscall.CloseHandle(serverSessionHandle);
+
+ if (RemoveSessionObj(serverSessionHandle, out var session))
+ {
+ (session as IDisposable)?.Dispose();
+ }
+ }
+
private bool Process(int serverSessionHandle, ulong recvListAddr)
{
IpcMessage request = ReadRequest();
@@ -360,7 +374,7 @@ namespace Ryujinx.HLE.HOS.Services
response.RawData = _responseDataStream.ToArray();
}
else if (request.Type == IpcMessageType.CmifControl ||
- request.Type == IpcMessageType.CmifControlWithContext)
+ request.Type == IpcMessageType.CmifControlWithContext)
{
#pragma warning disable IDE0059 // Remove unnecessary value assignment
uint magic = (uint)_requestDataReader.ReadUInt64();
@@ -412,11 +426,7 @@ namespace Ryujinx.HLE.HOS.Services
}
else if (request.Type == IpcMessageType.CmifCloseSession || request.Type == IpcMessageType.TipcCloseSession)
{
- _context.Syscall.CloseHandle(serverSessionHandle);
- if (RemoveSessionObj(serverSessionHandle, out var session))
- {
- (session as IDisposable)?.Dispose();
- }
+ DestroySession(serverSessionHandle);
shouldReply = false;
}
// If the type is past 0xF, we are using TIPC