diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2018-06-10 21:46:42 -0300 |
|---|---|---|
| committer | gdkchan <gab.dark.100@gmail.com> | 2018-06-10 21:46:42 -0300 |
| commit | 76f3b1b3a4637ec72abfbb8cbc0679f2e0ca838f (patch) | |
| tree | 0411b709de31c1c0517763512df8eeb9f7491bc9 /Ryujinx.HLE/OsHle/Handles/KThread.cs | |
| parent | 518fe799da6dd4f12c58c9e6e174767effb0b868 (diff) | |
Rename Ryujinx.Core to Ryujinx.HLE and add a separate project for a future LLE implementation
Diffstat (limited to 'Ryujinx.HLE/OsHle/Handles/KThread.cs')
| -rw-r--r-- | Ryujinx.HLE/OsHle/Handles/KThread.cs | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/Ryujinx.HLE/OsHle/Handles/KThread.cs b/Ryujinx.HLE/OsHle/Handles/KThread.cs new file mode 100644 index 00000000..d26a52f0 --- /dev/null +++ b/Ryujinx.HLE/OsHle/Handles/KThread.cs @@ -0,0 +1,86 @@ +using ChocolArm64; +using System.Collections.Generic; + +namespace Ryujinx.HLE.OsHle.Handles +{ + class KThread : KSynchronizationObject + { + public AThread Thread { get; private set; } + + public int CoreMask { get; set; } + + public long MutexAddress { get; set; } + public long CondVarAddress { get; set; } + + public bool CondVarSignaled { get; set; } + + private Process Process; + + public List<KThread> MutexWaiters { get; private set; } + + public KThread MutexOwner { get; set; } + + public int ActualPriority { get; private set; } + public int WantedPriority { get; private set; } + + public int ActualCore { get; set; } + public int ProcessorId { get; set; } + public int IdealCore { get; set; } + + public int WaitHandle { get; set; } + + public int ThreadId => Thread.ThreadId; + + public KThread( + AThread Thread, + Process Process, + int ProcessorId, + int Priority) + { + this.Thread = Thread; + this.Process = Process; + this.ProcessorId = ProcessorId; + this.IdealCore = ProcessorId; + + MutexWaiters = new List<KThread>(); + + CoreMask = 1 << ProcessorId; + + ActualPriority = WantedPriority = Priority; + } + + public void SetPriority(int Priority) + { + WantedPriority = Priority; + + UpdatePriority(); + } + + public void UpdatePriority() + { + int OldPriority = ActualPriority; + + int CurrPriority = WantedPriority; + + lock (Process.ThreadSyncLock) + { + foreach (KThread Thread in MutexWaiters) + { + if (CurrPriority > Thread.WantedPriority) + { + CurrPriority = Thread.WantedPriority; + } + } + } + + if (CurrPriority != OldPriority) + { + ActualPriority = CurrPriority; + + Process.Scheduler.Resort(this); + + MutexOwner?.UpdatePriority(); + } + } + } +}
\ No newline at end of file |
