forked from Mirror/Ryujinx
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:
parent
b73fa8eb22
commit
1df2c5ce7f
6 changed files with 31 additions and 3 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 },
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue