summaryrefslogtreecommitdiffstats
path: root/src/core/hle/kernel/thread.h
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2019-03-29 22:01:46 +0100
committerFernandoS27 <fsahmkow27@gmail.com>2019-10-15 17:55:06 +0200
commita1ac0c6cb47e10863b0bfbb1a6aadc71ccc513ab (patch)
treed4476f115b69c74f543f7992006f8e5548cd7f54 /src/core/hle/kernel/thread.h
parentImplement a new Core Scheduler (diff)
downloadyuzu-a1ac0c6cb47e10863b0bfbb1a6aadc71ccc513ab.tar
yuzu-a1ac0c6cb47e10863b0bfbb1a6aadc71ccc513ab.tar.gz
yuzu-a1ac0c6cb47e10863b0bfbb1a6aadc71ccc513ab.tar.bz2
yuzu-a1ac0c6cb47e10863b0bfbb1a6aadc71ccc513ab.tar.lz
yuzu-a1ac0c6cb47e10863b0bfbb1a6aadc71ccc513ab.tar.xz
yuzu-a1ac0c6cb47e10863b0bfbb1a6aadc71ccc513ab.tar.zst
yuzu-a1ac0c6cb47e10863b0bfbb1a6aadc71ccc513ab.zip
Diffstat (limited to 'src/core/hle/kernel/thread.h')
-rw-r--r--src/core/hle/kernel/thread.h55
1 files changed, 54 insertions, 1 deletions
diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h
index 07e989637..c426a7209 100644
--- a/src/core/hle/kernel/thread.h
+++ b/src/core/hle/kernel/thread.h
@@ -75,6 +75,21 @@ enum class ThreadActivity : u32 {
Paused = 1,
};
+enum class ThreadSchedStatus : u32 { None = 0, Paused = 1, Runnable = 2, Exited = 3 };
+
+enum ThreadSchedFlags : u32 {
+ ProcessPauseFlag = 1 << 4,
+ ThreadPauseFlag = 1 << 5,
+ ProcessDebugPauseFlag = 1 << 6,
+ KernelInitPauseFlag = 1 << 8,
+};
+
+enum ThreadSchedMasks : u32 {
+ LowMask = 0x000f,
+ HighMask = 0xfff0,
+ ForcePauseMask = 0x0070,
+};
+
class Thread final : public WaitObject {
public:
using MutexWaitingThreads = std::vector<SharedPtr<Thread>>;
@@ -278,6 +293,10 @@ public:
return processor_id;
}
+ void SetProcessorID(s32 new_core) {
+ processor_id = new_core;
+ }
+
Process* GetOwnerProcess() {
return owner_process;
}
@@ -383,11 +402,38 @@ public:
/// Sleeps this thread for the given amount of nanoseconds.
void Sleep(s64 nanoseconds);
+ /// Yields this thread without rebalancing loads.
+ void YieldType0();
+
+ /// Yields this thread and does a load rebalancing.
+ void YieldType1();
+
+ /// Yields this thread and if the core is left idle, loads are rebalanced
+ void YieldType2();
+
+ ThreadSchedStatus GetSchedulingStatus() {
+ return static_cast<ThreadSchedStatus>(scheduling_state & ThreadSchedMasks::LowMask);
+ }
+
+ bool IsRunning() const {
+ return is_running;
+ }
+
+ void SetIsRunning(bool value) {
+ is_running = value;
+ }
+
private:
explicit Thread(KernelCore& kernel);
~Thread() override;
- void ChangeScheduler();
+ void SetSchedulingStatus(ThreadSchedStatus new_status);
+ void SetCurrentPriority(u32 new_priority);
+ ResultCode SetCoreAndAffinityMask(s32 new_core, u64 new_affinity_mask);
+
+ void AdjustSchedulingOnStatus(u32 old_flags);
+ void AdjustSchedulingOnPriority(u32 old_priority);
+ void AdjustSchedulingOnAffinity(u64 old_affinity_mask, s32 old_core);
Core::ARM_Interface::ThreadContext context{};
@@ -453,6 +499,13 @@ private:
ThreadActivity activity = ThreadActivity::Normal;
+ s32 ideal_core_override = -1;
+ u64 affinity_mask_override = 0x1;
+ u32 affinity_override_count = 0;
+
+ u32 scheduling_state = 0;
+ bool is_running = false;
+
std::string name;
};