From 3b6fb29ec2fd80a7c5280cc18c90a7594eff2023 Mon Sep 17 00:00:00 2001 From: RMED24 <81475204+RMED24@users.noreply.github.com> Date: Wed, 22 Jun 2022 11:14:08 +0100 Subject: [PATCH] a --- Ryujinx.HLE/HOS/Horizon.cs | 2 +- Ryujinx.HLE/HOS/Services/ServerBase.cs | 26 ++++++++++++++++++- .../Sockets/Bsd/Impl/EventFileDescriptor.cs | 4 --- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Ryujinx.HLE/HOS/Horizon.cs b/Ryujinx.HLE/HOS/Horizon.cs index b93ebc032..2e64542e5 100644 --- a/Ryujinx.HLE/HOS/Horizon.cs +++ b/Ryujinx.HLE/HOS/Horizon.cs @@ -309,7 +309,7 @@ namespace Ryujinx.HLE.HOS // only then doing connections to SM is safe. SmServer.InitDone.WaitOne(); - BsdServer = new ServerBase(KernelContext, "BsdServer"); + BsdServer = new ServerBase(KernelContext, "BsdServer", null, 2); AudRenServer = new ServerBase(KernelContext, "AudioRendererServer"); AudOutServer = new ServerBase(KernelContext, "AudioOutServer"); FsServer = new ServerBase(KernelContext, "FsServer"); diff --git a/Ryujinx.HLE/HOS/Services/ServerBase.cs b/Ryujinx.HLE/HOS/Services/ServerBase.cs index c13ee1863..e6e273e2a 100644 --- a/Ryujinx.HLE/HOS/Services/ServerBase.cs +++ b/Ryujinx.HLE/HOS/Services/ServerBase.cs @@ -42,12 +42,15 @@ namespace Ryujinx.HLE.HOS.Services public string Name { get; } public Func SmObjectFactory { get; } - public ServerBase(KernelContext context, string name, Func smObjectFactory = null) + private int _threadCount; + + public ServerBase(KernelContext context, string name, Func smObjectFactory = null, int threadCount = 1) smObjectFactory = null) { InitDone = new ManualResetEvent(false); _context = context; Name = name; SmObjectFactory = smObjectFactory; + _threadCount = threadCount; const ProcessCreationFlags flags = ProcessCreationFlags.EnableAslr | @@ -83,6 +86,27 @@ namespace Ryujinx.HLE.HOS.Services private void Main() { + for (int i = 1; i < _threadCount; i++) + { + KernelResult result = _context.Syscall.CreateThread(out int threadHandle, 0UL, 0UL, 0UL, 44, 3, ServerLoop); + + if (result == KernelResult.Success) + { + result = _context.Syscall.StartThread(threadHandle); + + if (result != KernelResult.Success) + { + Logger.Error?.Print(LogClass.Service, $"Failed to start thread on {Name}: {result}"); + } + + _context.Syscall.CloseHandle(threadHandle); + } + else + { + Logger.Error?.Print(LogClass.Service, $"Failed to create thread on {Name}: {result}"); + } + } + ServerLoop(); } diff --git a/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs b/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs index 239e2434c..7a35d3da2 100644 --- a/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs +++ b/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs @@ -18,10 +18,6 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd public EventFileDescriptor(ulong value, EventFdFlags flags) { - // FIXME: We should support blocking operations. - // Right now they can't be supported because it would cause the - // service to lock up as we only have one thread processing requests. - flags |= EventFdFlags.NonBlocking; _value = value; _flags = flags;