aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/CpuThread.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ChocolArm64/CpuThread.cs')
-rw-r--r--ChocolArm64/CpuThread.cs69
1 files changed, 69 insertions, 0 deletions
diff --git a/ChocolArm64/CpuThread.cs b/ChocolArm64/CpuThread.cs
new file mode 100644
index 00000000..11f41236
--- /dev/null
+++ b/ChocolArm64/CpuThread.cs
@@ -0,0 +1,69 @@
+using ChocolArm64.Memory;
+using ChocolArm64.State;
+using System;
+using System.Threading;
+
+namespace ChocolArm64
+{
+ public class CpuThread
+ {
+ public CpuThreadState ThreadState { get; private set; }
+ public MemoryManager Memory { get; private set; }
+
+ private Translator _translator;
+
+ public Thread Work;
+
+ public event EventHandler WorkFinished;
+
+ private int _isExecuting;
+
+ public CpuThread(Translator translator, MemoryManager memory, long entryPoint)
+ {
+ _translator = translator;
+ Memory = memory;
+
+ ThreadState = new CpuThreadState();
+
+ ThreadState.ExecutionMode = ExecutionMode.AArch64;
+
+ ThreadState.Running = true;
+
+ Work = new Thread(delegate()
+ {
+ translator.ExecuteSubroutine(this, entryPoint);
+
+ memory.RemoveMonitor(ThreadState.Core);
+
+ WorkFinished?.Invoke(this, EventArgs.Empty);
+ });
+ }
+
+ public bool Execute()
+ {
+ if (Interlocked.Exchange(ref _isExecuting, 1) == 1)
+ {
+ return false;
+ }
+
+ Work.Start();
+
+ return true;
+ }
+
+ public void StopExecution()
+ {
+ ThreadState.Running = false;
+ }
+
+ public void RequestInterrupt()
+ {
+ ThreadState.RequestInterrupt();
+ }
+
+ public bool IsCurrentThread()
+ {
+ return Thread.CurrentThread == Work;
+ }
+ }
+} \ No newline at end of file