aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerSessionManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerSessionManager.cs')
-rw-r--r--src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerSessionManager.cs95
1 files changed, 43 insertions, 52 deletions
diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerSessionManager.cs b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerSessionManager.cs
index 6d395081..bd5a4844 100644
--- a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerSessionManager.cs
+++ b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerSessionManager.cs
@@ -75,7 +75,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
}
session.PointerBuffer = GetSessionPointerBuffer(session);
- session.SavedMessage = GetSessionSavedMessageBuffer(session);
+ session.SavedMessage = GetSessionSavedMessageBuffer(session);
RegisterSessionToWaitList(session);
@@ -110,10 +110,10 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
}
protected virtual Server AllocateServer(
- int portIndex,
- int portHandle,
- ServiceName name,
- bool managed,
+ int portIndex,
+ int portHandle,
+ ServiceName name,
+ bool managed,
ServiceObjectHolder staticHoder)
{
throw new NotSupportedException();
@@ -161,29 +161,25 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
return Result.Success;
}
- else
+
+ Result result = ProcessRequestImpl(session, message, message);
+
+ if (result.IsSuccess)
{
- Result result = ProcessRequestImpl(session, message, message);
+ RegisterSessionToWaitList(session);
- if (result.IsSuccess)
- {
- RegisterSessionToWaitList(session);
+ return Result.Success;
+ }
+ else if (SfResult.RequestContextChanged(result))
+ {
+ return result;
+ }
- return Result.Success;
- }
- else if (SfResult.RequestContextChanged(result))
- {
- return result;
- }
- else
- {
- Logger.Warning?.Print(LogClass.KernelIpc, $"Request processing returned error {result}");
+ Logger.Warning?.Print(LogClass.KernelIpc, $"Request processing returned error {result}");
- CloseSessionImpl(session);
+ CloseSessionImpl(session);
- return Result.Success;
- }
- }
+ return Result.Success;
}
private Result ProcessRequestImpl(ServerSession session, Span<byte> inMessage, Span<byte> outMessage)
@@ -192,18 +188,13 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
using var _ = new ScopedInlineContextChange(GetInlineContext(commandType, inMessage));
- switch (commandType)
+ return commandType switch
{
- case CommandType.Request:
- case CommandType.RequestWithContext:
- return DispatchRequest(session.ServiceObjectHolder, session, inMessage, outMessage);
- case CommandType.Control:
- case CommandType.ControlWithContext:
- return DispatchManagerRequest(session, inMessage, outMessage);
- default:
- return HipcResult.UnknownCommandType;
+ CommandType.Request or CommandType.RequestWithContext => DispatchRequest(session.ServiceObjectHolder, session, inMessage, outMessage),
+ CommandType.Control or CommandType.ControlWithContext => DispatchManagerRequest(session, inMessage, outMessage),
+ _ => HipcResult.UnknownCommandType,
+ };
}
- }
private static int GetInlineContext(CommandType commandType, ReadOnlySpan<byte> inMessage)
{
@@ -221,12 +212,12 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
return 0;
}
- protected Result ReceiveRequest(ServerSession session, Span<byte> message)
+ protected static Result ReceiveRequest(ServerSession session, Span<byte> message)
{
return ReceiveRequestImpl(session, message);
}
- private Result ReceiveRequestImpl(ServerSession session, Span<byte> message)
+ private static Result ReceiveRequestImpl(ServerSession session, Span<byte> message)
{
PointerAndSize pointerBuffer = session.PointerBuffer;
@@ -234,19 +225,19 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
{
if (pointerBuffer.Address != 0)
{
- HipcMessageData messageData = HipcMessage.WriteMessage(message, new HipcMetadata()
+ HipcMessageData messageData = HipcMessage.WriteMessage(message, new HipcMetadata
{
- Type = (int)CommandType.Invalid,
- ReceiveStaticsCount = HipcMessage.AutoReceiveStatic
+ Type = (int)CommandType.Invalid,
+ ReceiveStaticsCount = HipcMessage.AutoReceiveStatic,
});
messageData.ReceiveList[0] = new HipcReceiveListEntry(pointerBuffer.Address, pointerBuffer.Size);
}
else
{
- MemoryMarshal.Cast<byte, Header>(message)[0] = new Header()
+ MemoryMarshal.Cast<byte, Header>(message)[0] = new Header
{
- Type = CommandType.Invalid
+ Type = CommandType.Invalid,
};
}
@@ -276,9 +267,9 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
protected virtual Result DispatchRequest(
ServiceObjectHolder objectHolder,
- ServerSession session,
- Span<byte> inMessage,
- Span<byte> outMessage)
+ ServerSession session,
+ Span<byte> inMessage,
+ Span<byte> outMessage)
{
HipcMessage request;
@@ -291,16 +282,16 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
return HipcResult.InvalidRequestSize;
}
- var dispatchCtx = new ServiceDispatchContext()
+ var dispatchCtx = new ServiceDispatchContext
{
- ServiceObject = objectHolder.ServiceObject,
- Manager = this,
- Session = session,
- HandlesToClose = new HandlesToClose(),
- PointerBuffer = session.PointerBuffer,
- InMessageBuffer = inMessage,
+ ServiceObject = objectHolder.ServiceObject,
+ Manager = this,
+ Session = session,
+ HandlesToClose = new HandlesToClose(),
+ PointerBuffer = session.PointerBuffer,
+ InMessageBuffer = inMessage,
OutMessageBuffer = outMessage,
- Request = request
+ Request = request,
};
ReadOnlySpan<byte> inRawData = MemoryMarshal.Cast<uint, byte>(dispatchCtx.Request.Data.DataWords);
@@ -337,4 +328,4 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
return this;
}
}
-} \ No newline at end of file
+}