aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Ipc
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Ipc')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs62
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Ipc/KClientPort.cs15
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs13
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Ipc/KPort.cs21
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs77
5 files changed, 96 insertions, 92 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs
index 5726299b..593d2c9d 100644
--- a/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs
@@ -1,6 +1,6 @@
using Ryujinx.Common;
-using Ryujinx.HLE.HOS.Kernel.Common;
using Ryujinx.HLE.HOS.Kernel.Memory;
+using Ryujinx.Horizon.Common;
using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Kernel.Ipc
@@ -20,38 +20,38 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
_exchangeBufferDescriptors = new List<KBufferDescriptor>(MaxInternalBuffersCount);
}
- public KernelResult AddSendBuffer(ulong src, ulong dst, ulong size, MemoryState state)
+ public Result AddSendBuffer(ulong src, ulong dst, ulong size, MemoryState state)
{
return Add(_sendBufferDescriptors, src, dst, size, state);
}
- public KernelResult AddReceiveBuffer(ulong src, ulong dst, ulong size, MemoryState state)
+ public Result AddReceiveBuffer(ulong src, ulong dst, ulong size, MemoryState state)
{
return Add(_receiveBufferDescriptors, src, dst, size, state);
}
- public KernelResult AddExchangeBuffer(ulong src, ulong dst, ulong size, MemoryState state)
+ public Result AddExchangeBuffer(ulong src, ulong dst, ulong size, MemoryState state)
{
return Add(_exchangeBufferDescriptors, src, dst, size, state);
}
- private KernelResult Add(List<KBufferDescriptor> list, ulong src, ulong dst, ulong size, MemoryState state)
+ private Result Add(List<KBufferDescriptor> list, ulong src, ulong dst, ulong size, MemoryState state)
{
if (list.Count < MaxInternalBuffersCount)
{
list.Add(new KBufferDescriptor(src, dst, size, state));
- return KernelResult.Success;
+ return Result.Success;
}
return KernelResult.OutOfMemory;
}
- public KernelResult CopyBuffersToClient(KPageTableBase memoryManager)
+ public Result CopyBuffersToClient(KPageTableBase memoryManager)
{
- KernelResult result = CopyToClient(memoryManager, _receiveBufferDescriptors);
+ Result result = CopyToClient(memoryManager, _receiveBufferDescriptors);
- if (result != KernelResult.Success)
+ if (result != Result.Success)
{
return result;
}
@@ -59,7 +59,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
return CopyToClient(memoryManager, _exchangeBufferDescriptors);
}
- private KernelResult CopyToClient(KPageTableBase memoryManager, List<KBufferDescriptor> list)
+ private Result CopyToClient(KPageTableBase memoryManager, List<KBufferDescriptor> list)
{
foreach (KBufferDescriptor desc in list)
{
@@ -94,7 +94,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
copySize = desc.Size;
}
- KernelResult result = memoryManager.CopyDataFromCurrentProcess(
+ Result result = memoryManager.CopyDataFromCurrentProcess(
desc.ClientAddress,
copySize,
stateMask,
@@ -104,7 +104,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
MemoryAttribute.None,
desc.ServerAddress);
- if (result != KernelResult.Success)
+ if (result != Result.Success)
{
return result;
}
@@ -120,7 +120,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
if (clientEndAddrTruncated < clientEndAddrRounded &&
(clientAddrTruncated == clientAddrRounded || clientAddrTruncated < clientEndAddrTruncated))
{
- KernelResult result = memoryManager.CopyDataFromCurrentProcess(
+ Result result = memoryManager.CopyDataFromCurrentProcess(
clientEndAddrTruncated,
clientEndAddr - clientEndAddrTruncated,
stateMask,
@@ -130,28 +130,28 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
MemoryAttribute.None,
serverEndAddrTruncated);
- if (result != KernelResult.Success)
+ if (result != Result.Success)
{
return result;
}
}
}
- return KernelResult.Success;
+ return Result.Success;
}
- public KernelResult UnmapServerBuffers(KPageTableBase memoryManager)
+ public Result UnmapServerBuffers(KPageTableBase memoryManager)
{
- KernelResult result = UnmapServer(memoryManager, _sendBufferDescriptors);
+ Result result = UnmapServer(memoryManager, _sendBufferDescriptors);
- if (result != KernelResult.Success)
+ if (result != Result.Success)
{
return result;
}
result = UnmapServer(memoryManager, _receiveBufferDescriptors);
- if (result != KernelResult.Success)
+ if (result != Result.Success)
{
return result;
}
@@ -159,36 +159,36 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
return UnmapServer(memoryManager, _exchangeBufferDescriptors);
}
- private KernelResult UnmapServer(KPageTableBase memoryManager, List<KBufferDescriptor> list)
+ private Result UnmapServer(KPageTableBase memoryManager, List<KBufferDescriptor> list)
{
foreach (KBufferDescriptor descriptor in list)
{
- KernelResult result = memoryManager.UnmapNoAttributeIfStateEquals(
+ Result result = memoryManager.UnmapNoAttributeIfStateEquals(
descriptor.ServerAddress,
descriptor.Size,
descriptor.State);
- if (result != KernelResult.Success)
+ if (result != Result.Success)
{
return result;
}
}
- return KernelResult.Success;
+ return Result.Success;
}
- public KernelResult RestoreClientBuffers(KPageTableBase memoryManager)
+ public Result RestoreClientBuffers(KPageTableBase memoryManager)
{
- KernelResult result = RestoreClient(memoryManager, _sendBufferDescriptors);
+ Result result = RestoreClient(memoryManager, _sendBufferDescriptors);
- if (result != KernelResult.Success)
+ if (result != Result.Success)
{
return result;
}
result = RestoreClient(memoryManager, _receiveBufferDescriptors);
- if (result != KernelResult.Success)
+ if (result != Result.Success)
{
return result;
}
@@ -196,22 +196,22 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
return RestoreClient(memoryManager, _exchangeBufferDescriptors);
}
- private KernelResult RestoreClient(KPageTableBase memoryManager, List<KBufferDescriptor> list)
+ private Result RestoreClient(KPageTableBase memoryManager, List<KBufferDescriptor> list)
{
foreach (KBufferDescriptor descriptor in list)
{
- KernelResult result = memoryManager.UnmapIpcRestorePermission(
+ Result result = memoryManager.UnmapIpcRestorePermission(
descriptor.ClientAddress,
descriptor.Size,
descriptor.State);
- if (result != KernelResult.Success)
+ if (result != Result.Success)
{
return result;
}
}
- return KernelResult.Success;
+ return Result.Success;
}
}
} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KClientPort.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KClientPort.cs
index 6e935077..eb7c5a41 100644
--- a/Ryujinx.HLE/HOS/Kernel/Ipc/KClientPort.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KClientPort.cs
@@ -1,5 +1,6 @@
using Ryujinx.HLE.HOS.Kernel.Common;
using Ryujinx.HLE.HOS.Kernel.Process;
+using Ryujinx.Horizon.Common;
using System.Threading;
namespace Ryujinx.HLE.HOS.Kernel.Ipc
@@ -19,7 +20,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
_parent = parent;
}
- public KernelResult Connect(out KClientSession clientSession)
+ public Result Connect(out KClientSession clientSession)
{
clientSession = null;
@@ -40,9 +41,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
KSession session = new KSession(KernelContext, this);
- KernelResult result = _parent.EnqueueIncomingSession(session.ServerSession);
+ Result result = _parent.EnqueueIncomingSession(session.ServerSession);
- if (result != KernelResult.Success)
+ if (result != Result.Success)
{
session.ClientSession.DecrementReferenceCount();
session.ServerSession.DecrementReferenceCount();
@@ -55,7 +56,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
return result;
}
- public KernelResult ConnectLight(out KLightClientSession clientSession)
+ public Result ConnectLight(out KLightClientSession clientSession)
{
clientSession = null;
@@ -76,9 +77,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
KLightSession session = new KLightSession(KernelContext);
- KernelResult result = _parent.EnqueueIncomingLightSession(session.ServerSession);
+ Result result = _parent.EnqueueIncomingLightSession(session.ServerSession);
- if (result != KernelResult.Success)
+ if (result != Result.Success)
{
session.ClientSession.DecrementReferenceCount();
session.ServerSession.DecrementReferenceCount();
@@ -128,7 +129,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
}
}
- public new static KernelResult RemoveName(KernelContext context, string name)
+ public new static Result RemoveName(KernelContext context, string name)
{
KAutoObject foundObj = FindNamedObject(context, name);
diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs
index 7bbc3ba2..a24bcc31 100644
--- a/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs
@@ -1,6 +1,7 @@
using Ryujinx.HLE.HOS.Kernel.Common;
using Ryujinx.HLE.HOS.Kernel.Process;
using Ryujinx.HLE.HOS.Kernel.Threading;
+using Ryujinx.Horizon.Common;
namespace Ryujinx.HLE.HOS.Kernel.Ipc
{
@@ -27,7 +28,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
CreatorProcess.IncrementReferenceCount();
}
- public KernelResult SendSyncRequest(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
+ public Result SendSyncRequest(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
{
KThread currentThread = KernelStatic.GetCurrentThread();
@@ -36,13 +37,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
KernelContext.CriticalSection.Enter();
currentThread.SignaledObj = null;
- currentThread.ObjSyncResult = KernelResult.Success;
+ currentThread.ObjSyncResult = Result.Success;
- KernelResult result = _parent.ServerSession.EnqueueRequest(request);
+ Result result = _parent.ServerSession.EnqueueRequest(request);
KernelContext.CriticalSection.Leave();
- if (result == KernelResult.Success)
+ if (result == Result.Success)
{
result = currentThread.ObjSyncResult;
}
@@ -50,7 +51,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
return result;
}
- public KernelResult SendAsyncRequest(KWritableEvent asyncEvent, ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
+ public Result SendAsyncRequest(KWritableEvent asyncEvent, ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
{
KThread currentThread = KernelStatic.GetCurrentThread();
@@ -58,7 +59,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
KernelContext.CriticalSection.Enter();
- KernelResult result = _parent.ServerSession.EnqueueRequest(request);
+ Result result = _parent.ServerSession.EnqueueRequest(request);
KernelContext.CriticalSection.Leave();
diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KPort.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KPort.cs
index 2f67aeae..93f0f34c 100644
--- a/Ryujinx.HLE/HOS/Kernel/Ipc/KPort.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KPort.cs
@@ -1,4 +1,5 @@
using Ryujinx.HLE.HOS.Kernel.Common;
+using Ryujinx.Horizon.Common;
namespace Ryujinx.HLE.HOS.Kernel.Ipc
{
@@ -7,26 +8,26 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
public KServerPort ServerPort { get; }
public KClientPort ClientPort { get; }
- private long _nameAddress;
+ private string _name;
private ChannelState _state;
public bool IsLight { get; private set; }
- public KPort(KernelContext context, int maxSessions, bool isLight, long nameAddress) : base(context)
+ public KPort(KernelContext context, int maxSessions, bool isLight, string name) : base(context)
{
ServerPort = new KServerPort(context, this);
ClientPort = new KClientPort(context, this, maxSessions);
- IsLight = isLight;
- _nameAddress = nameAddress;
+ IsLight = isLight;
+ _name = name;
_state = ChannelState.Open;
}
- public KernelResult EnqueueIncomingSession(KServerSession session)
+ public Result EnqueueIncomingSession(KServerSession session)
{
- KernelResult result;
+ Result result;
KernelContext.CriticalSection.Enter();
@@ -34,7 +35,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
{
ServerPort.EnqueueIncomingSession(session);
- result = KernelResult.Success;
+ result = Result.Success;
}
else
{
@@ -46,9 +47,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
return result;
}
- public KernelResult EnqueueIncomingLightSession(KLightServerSession session)
+ public Result EnqueueIncomingLightSession(KLightServerSession session)
{
- KernelResult result;
+ Result result;
KernelContext.CriticalSection.Enter();
@@ -56,7 +57,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
{
ServerPort.EnqueueIncomingLightSession(session);
- result = KernelResult.Success;
+ result = Result.Success;
}
else
{
diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs
index 199e78dc..9c2184d9 100644
--- a/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs
@@ -3,6 +3,7 @@ using Ryujinx.HLE.HOS.Kernel.Common;
using Ryujinx.HLE.HOS.Kernel.Memory;
using Ryujinx.HLE.HOS.Kernel.Process;
using Ryujinx.HLE.HOS.Kernel.Threading;
+using Ryujinx.Horizon.Common;
using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Kernel.Ipc
@@ -178,7 +179,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
_requests = new LinkedList<KSessionRequest>();
}
- public KernelResult EnqueueRequest(KSessionRequest request)
+ public Result EnqueueRequest(KSessionRequest request)
{
if (_parent.ClientSession.State != ChannelState.Open)
{
@@ -203,10 +204,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
Signal();
}
- return KernelResult.Success;
+ return Result.Success;
}
- public KernelResult Receive(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
+ public Result Receive(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
{
KThread serverThread = KernelStatic.GetCurrentThread();
KProcess serverProcess = serverThread.Owner;
@@ -249,12 +250,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
MessageHeader clientHeader = GetClientMessageHeader(clientProcess, clientMsg);
MessageHeader serverHeader = GetServerMessageHeader(serverMsg);
- KernelResult serverResult = KernelResult.NotFound;
- KernelResult clientResult = KernelResult.Success;
+ Result serverResult = KernelResult.NotFound;
+ Result clientResult = Result.Success;
void CleanUpForError()
{
- if (request.BufferDescriptorTable.UnmapServerBuffers(serverProcess.MemoryManager) == KernelResult.Success)
+ if (request.BufferDescriptorTable.UnmapServerBuffers(serverProcess.MemoryManager) == Result.Success)
{
request.BufferDescriptorTable.RestoreClientBuffers(clientProcess.MemoryManager);
}
@@ -348,7 +349,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
int newHandle = 0;
int handle = clientProcess.CpuMemory.Read<int>(clientMsg.Address + offset * 4);
- if (clientResult == KernelResult.Success && handle != 0)
+ if (clientResult == Result.Success && handle != 0)
{
clientResult = GetCopyObjectHandle(clientThread, serverProcess, handle, out newHandle);
}
@@ -365,7 +366,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
if (handle != 0)
{
- if (clientResult == KernelResult.Success)
+ if (clientResult == Result.Success)
{
clientResult = GetMoveObjectHandle(clientProcess, serverProcess, handle, out newHandle);
}
@@ -380,7 +381,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
offset++;
}
- if (clientResult != KernelResult.Success)
+ if (clientResult != Result.Success)
{
CleanUpForError();
@@ -412,7 +413,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
ref recvListDstOffset,
out ulong recvListBufferAddress);
- if (clientResult != KernelResult.Success)
+ if (clientResult != Result.Success)
{
CleanUpForError();
@@ -429,7 +430,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
MemoryAttribute.Uncached,
MemoryAttribute.None);
- if (clientResult != KernelResult.Success)
+ if (clientResult != Result.Success)
{
CleanUpForError();
@@ -498,7 +499,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
notReceiveDesc,
out dstAddress);
- if (clientResult != KernelResult.Success)
+ if (clientResult != Result.Success)
{
CleanUpForError();
@@ -518,7 +519,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
clientResult = request.BufferDescriptorTable.AddExchangeBuffer(bufferAddress, dstAddress, bufferSize, state);
}
- if (clientResult != KernelResult.Success)
+ if (clientResult != Result.Success)
{
CleanUpForError();
@@ -573,7 +574,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
serverProcess.CpuMemory.Write(copyDst, clientProcess.CpuMemory.GetSpan(copySrc, (int)copySize));
}
- if (clientResult != KernelResult.Success)
+ if (clientResult != Result.Success)
{
CleanUpForError();
@@ -581,10 +582,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
}
}
- return KernelResult.Success;
+ return Result.Success;
}
- public KernelResult Reply(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
+ public Result Reply(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
{
KThread serverThread = KernelStatic.GetCurrentThread();
KProcess serverProcess = serverThread.Owner;
@@ -618,8 +619,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
MessageHeader clientHeader = GetClientMessageHeader(clientProcess, clientMsg);
MessageHeader serverHeader = GetServerMessageHeader(serverMsg);
- KernelResult clientResult = KernelResult.Success;
- KernelResult serverResult = KernelResult.Success;
+ Result clientResult = Result.Success;
+ Result serverResult = Result.Success;
void CleanUpForError()
{
@@ -683,7 +684,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
// Copy receive and exchange buffers.
clientResult = request.BufferDescriptorTable.CopyBuffersToClient(clientProcess.MemoryManager);
- if (clientResult != KernelResult.Success)
+ if (clientResult != Result.Success)
{
CleanUpForError();
@@ -734,7 +735,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
if (handle != 0)
{
- if (clientResult == KernelResult.Success)
+ if (clientResult == Result.Success)
{
clientResult = GetMoveObjectHandle(serverProcess, clientProcess, handle, out newHandle);
}
@@ -776,7 +777,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
ref recvListDstOffset,
out recvListBufferAddress);
- if (clientResult != KernelResult.Success)
+ if (clientResult != Result.Success)
{
CleanUpForError();
@@ -793,7 +794,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
MemoryAttribute.None,
descriptor.BufferAddress);
- if (clientResult != KernelResult.Success)
+ if (clientResult != Result.Success)
{
CleanUpForError();
@@ -888,7 +889,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
return new MessageHeader(word0, word1, word2);
}
- private KernelResult GetCopyObjectHandle(KThread srcThread, KProcess dstProcess, int srcHandle, out int dstHandle)
+ private Result GetCopyObjectHandle(KThread srcThread, KProcess dstProcess, int srcHandle, out int dstHandle)
{
dstHandle = 0;
@@ -919,7 +920,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
}
}
- private KernelResult GetMoveObjectHandle(KProcess srcProcess, KProcess dstProcess, int srcHandle, out int dstHandle)
+ private Result GetMoveObjectHandle(KProcess srcProcess, KProcess dstProcess, int srcHandle, out int dstHandle)
{
dstHandle = 0;
@@ -927,7 +928,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
if (obj != null)
{
- KernelResult result = dstProcess.HandleTable.GenerateHandle(obj, out dstHandle);
+ Result result = dstProcess.HandleTable.GenerateHandle(obj, out dstHandle);
srcProcess.HandleTable.CloseHandle(srcHandle);
@@ -964,7 +965,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
return receiveList;
}
- private KernelResult GetReceiveListAddress(
+ private Result GetReceiveListAddress(
PointerBufferDesc descriptor,
Message message,
uint recvListType,
@@ -1038,7 +1039,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
address = recvListBufferAddress;
- return KernelResult.Success;
+ return Result.Success;
}
private void CloseAllHandles(Message message, MessageHeader header, KProcess process)
@@ -1166,19 +1167,19 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
return hasRequest;
}
- private void FinishRequest(KSessionRequest request, KernelResult result)
+ private void FinishRequest(KSessionRequest request, Result result)
{
KProcess clientProcess = request.ClientThread.Owner;
KProcess serverProcess = request.ServerProcess;
- KernelResult unmapResult = KernelResult.Success;
+ Result unmapResult = Result.Success;
if (serverProcess != null)
{
unmapResult = request.BufferDescriptorTable.UnmapServerBuffers(serverProcess.MemoryManager);
}
- if (unmapResult == KernelResult.Success)
+ if (unmapResult == Result.Success)
{
request.BufferDescriptorTable.RestoreClientBuffers(clientProcess.MemoryManager);
}
@@ -1186,7 +1187,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
WakeClientThread(request, result);
}
- private void WakeClientThread(KSessionRequest request, KernelResult result)
+ private void WakeClientThread(KSessionRequest request, Result result)
{
// Wait client thread waiting for a response for the given request.
if (request.AsyncEvent != null)
@@ -1203,16 +1204,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
}
}
- private void SendResultToAsyncRequestClient(KSessionRequest request, KernelResult result)
+ private void SendResultToAsyncRequestClient(KSessionRequest request, Result result)
{
KProcess clientProcess = request.ClientThread.Owner;
- if (result != KernelResult.Success)
+ if (result != Result.Success)
{
ulong address = request.CustomCmdBuffAddr;
clientProcess.CpuMemory.Write<ulong>(address, 0);
- clientProcess.CpuMemory.Write(address + 8, (int)result);
+ clientProcess.CpuMemory.Write(address + 8, result.ErrorCode);
}
clientProcess.MemoryManager.UnborrowIpcBuffer(request.CustomCmdBuffAddr, request.CustomCmdBuffSize);
@@ -1220,24 +1221,24 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
request.AsyncEvent.Signal();
}
- private void WakeServerThreads(KernelResult result)
+ private void WakeServerThreads(Result result)
{
// Wake all server threads waiting for requests.
KernelContext.CriticalSection.Enter();
foreach (KThread thread in WaitingThreads)
{
- WakeAndSetResult(thread, result);
+ WakeAndSetResult(thread, result, this);
}
KernelContext.CriticalSection.Leave();
}
- private void WakeAndSetResult(KThread thread, KernelResult result)
+ private void WakeAndSetResult(KThread thread, Result result, KSynchronizationObject signaledObj = null)
{
if ((thread.SchedFlags & ThreadSchedState.LowMask) == ThreadSchedState.Paused)
{
- thread.SignaledObj = null;
+ thread.SignaledObj = signaledObj;
thread.ObjSyncResult = result;
thread.Reschedule(ThreadSchedState.Running);