Gracefully close the app on exit (#12)

* Gracefully close the app on exit

* Application tear down

instead of calling Environment.Exit(0); do a better tear down of the application
This commit is contained in:
Cristian Carlesso 2018-02-15 12:16:16 +00:00 committed by gdkchan
parent b73fa8eb22
commit 1df2c5ce7f
6 changed files with 31 additions and 3 deletions

View file

@ -50,6 +50,10 @@ namespace Ryujinx
using (GLScreen Screen = new GLScreen(Ns, Renderer)) using (GLScreen Screen = new GLScreen(Ns, Renderer))
{ {
Ns.Finish += (Sender, Args) => {
Screen.Exit();
};
Screen.Run(60.0); Screen.Run(60.0);
} }

View file

@ -4,6 +4,7 @@ using Ryujinx.OsHle.Handles;
using Ryujinx.OsHle.Utilities; using Ryujinx.OsHle.Utilities;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.IO; using System.IO;
using System;
namespace Ryujinx.OsHle namespace Ryujinx.OsHle
{ {
@ -136,6 +137,18 @@ namespace Ryujinx.OsHle
} }
} }
internal bool ExitProcess(int ProcessId) {
Process process;
var Success = Processes.TryRemove(ProcessId, out process);
if (Success) {
process.StopAllThreads();
}
if (Processes.Count == 0) {
Ns.OnFinish(EventArgs.Empty);
}
return Success;
}
internal bool TryGetProcess(int ProcessId, out Process Process) internal bool TryGetProcess(int ProcessId, out Process Process)
{ {
if (!Processes.TryGetValue(ProcessId, out Process)) if (!Processes.TryGetValue(ProcessId, out Process))

View file

@ -116,7 +116,7 @@ namespace Ryujinx.OsHle
{ {
if (MainThread != null) if (MainThread != null)
{ {
while (MainThread.Thread.IsAlive) if (MainThread.Thread.IsAlive)
{ {
MainThread.Thread.StopExecution(); MainThread.Thread.StopExecution();
} }
@ -124,7 +124,7 @@ namespace Ryujinx.OsHle
foreach (AThread Thread in TlsSlots.Values) foreach (AThread Thread in TlsSlots.Values)
{ {
while (Thread.IsAlive) if (Thread.IsAlive)
{ {
Thread.StopExecution(); Thread.StopExecution();
} }

View file

@ -8,7 +8,6 @@ namespace Ryujinx.OsHle.Svc
partial class SvcHandler partial class SvcHandler
{ {
private delegate void SvcFunc(ARegisters Registers); private delegate void SvcFunc(ARegisters Registers);
private Dictionary<int, SvcFunc> SvcFuncs; private Dictionary<int, SvcFunc> SvcFuncs;
private Switch Ns; private Switch Ns;
@ -25,6 +24,7 @@ namespace Ryujinx.OsHle.Svc
{ 0x03, SvcSetMemoryAttribute }, { 0x03, SvcSetMemoryAttribute },
{ 0x04, SvcMapMemory }, { 0x04, SvcMapMemory },
{ 0x06, SvcQueryMemory }, { 0x06, SvcQueryMemory },
{ 0x07, SvcExitProcess },
{ 0x08, SvcCreateThread }, { 0x08, SvcCreateThread },
{ 0x09, SvcStartThread }, { 0x09, SvcStartThread },
{ 0x0b, SvcSleepThread }, { 0x0b, SvcSleepThread },

View file

@ -9,6 +9,8 @@ namespace Ryujinx.OsHle.Svc
{ {
partial class SvcHandler partial class SvcHandler
{ {
private void SvcExitProcess(ARegisters Registers) => Ns.Os.ExitProcess(Registers.ProcessId);
private void SvcCloseHandle(ARegisters Registers) private void SvcCloseHandle(ARegisters Registers)
{ {
int Handle = (int)Registers.X0; int Handle = (int)Registers.X0;

View file

@ -24,6 +24,15 @@ namespace Ryujinx
VFs = new VirtualFs(); VFs = new VirtualFs();
} }
public event EventHandler Finish;
internal virtual void OnFinish(EventArgs e)
{
EventHandler Handler = Finish;
if (Handler != null)
{
Handler(this, e);
}
}
public void Dispose() public void Dispose()
{ {
Dispose(true); Dispose(true);