|
@@ -32,6 +32,7 @@ using Ryujinx.HLE.Loaders.Executables;
|
|
|
using Ryujinx.HLE.Utilities;
|
|
using Ryujinx.HLE.Utilities;
|
|
|
using System;
|
|
using System;
|
|
|
using System.IO;
|
|
using System.IO;
|
|
|
|
|
+using System.Linq;
|
|
|
using System.Threading;
|
|
using System.Threading;
|
|
|
|
|
|
|
|
namespace Ryujinx.HLE.HOS
|
|
namespace Ryujinx.HLE.HOS
|
|
@@ -318,8 +319,6 @@ namespace Ryujinx.HLE.HOS
|
|
|
|
|
|
|
|
_isDisposed = true;
|
|
_isDisposed = true;
|
|
|
|
|
|
|
|
- SurfaceFlinger.Dispose();
|
|
|
|
|
-
|
|
|
|
|
KProcess terminationProcess = new KProcess(KernelContext);
|
|
KProcess terminationProcess = new KProcess(KernelContext);
|
|
|
KThread terminationThread = new KThread(KernelContext);
|
|
KThread terminationThread = new KThread(KernelContext);
|
|
|
|
|
|
|
@@ -328,7 +327,18 @@ namespace Ryujinx.HLE.HOS
|
|
|
// Force all threads to exit.
|
|
// Force all threads to exit.
|
|
|
lock (KernelContext.Processes)
|
|
lock (KernelContext.Processes)
|
|
|
{
|
|
{
|
|
|
- foreach (KProcess process in KernelContext.Processes.Values)
|
|
|
|
|
|
|
+ // Terminate application.
|
|
|
|
|
+ foreach (KProcess process in KernelContext.Processes.Values.Where(x => x.Flags.HasFlag(ProcessCreationFlags.IsApplication)))
|
|
|
|
|
+ {
|
|
|
|
|
+ process.Terminate();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // The application existed, now surface flinger can exit too.
|
|
|
|
|
+ SurfaceFlinger.Dispose();
|
|
|
|
|
+
|
|
|
|
|
+ // Terminate HLE services (must be done after the application is already terminated,
|
|
|
|
|
+ // otherwise the application will receive errors due to service termination.
|
|
|
|
|
+ foreach (KProcess process in KernelContext.Processes.Values.Where(x => !x.Flags.HasFlag(ProcessCreationFlags.IsApplication)))
|
|
|
{
|
|
{
|
|
|
process.Terminate();
|
|
process.Terminate();
|
|
|
}
|
|
}
|