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))
{
Ns.Finish += (Sender, Args) => {
Screen.Exit();
};
Screen.Run(60.0);
}

View file

@ -4,6 +4,7 @@ using Ryujinx.OsHle.Handles;
using Ryujinx.OsHle.Utilities;
using System.Collections.Concurrent;
using System.IO;
using System;
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)
{
if (!Processes.TryGetValue(ProcessId, out Process))

View file

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

View file

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

View file

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

View file

@ -24,6 +24,15 @@ namespace Ryujinx
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()
{
Dispose(true);