|
|
|
@ -4,6 +4,7 @@ |
|
|
|
|
|
|
|
#pragma once |
|
|
|
|
|
|
|
#include <array> |
|
|
|
#include <functional> |
|
|
|
#include <string> |
|
|
|
#include <utility> |
|
|
|
@ -346,10 +347,11 @@ public: |
|
|
|
|
|
|
|
void SetStatus(ThreadStatus new_status); |
|
|
|
|
|
|
|
constexpr s64 GetLastScheduledTick() const { |
|
|
|
s64 GetLastScheduledTick() const { |
|
|
|
return this->last_scheduled_tick; |
|
|
|
} |
|
|
|
constexpr void SetLastScheduledTick(s64 tick) { |
|
|
|
|
|
|
|
void SetLastScheduledTick(s64 tick) { |
|
|
|
this->last_scheduled_tick = tick; |
|
|
|
} |
|
|
|
|
|
|
|
@ -481,7 +483,7 @@ public: |
|
|
|
return ideal_core; |
|
|
|
} |
|
|
|
|
|
|
|
constexpr const KAffinityMask& GetAffinityMask() const { |
|
|
|
const KAffinityMask& GetAffinityMask() const { |
|
|
|
return affinity_mask; |
|
|
|
} |
|
|
|
|
|
|
|
@ -490,10 +492,11 @@ public: |
|
|
|
/// Sleeps this thread for the given amount of nanoseconds. |
|
|
|
ResultCode Sleep(s64 nanoseconds); |
|
|
|
|
|
|
|
constexpr s64 GetYieldScheduleCount() const { |
|
|
|
s64 GetYieldScheduleCount() const { |
|
|
|
return this->schedule_count; |
|
|
|
} |
|
|
|
constexpr void SetYieldScheduleCount(s64 count) { |
|
|
|
|
|
|
|
void SetYieldScheduleCount(s64 count) { |
|
|
|
this->schedule_count = count; |
|
|
|
} |
|
|
|
|
|
|
|
@ -570,14 +573,9 @@ public: |
|
|
|
return has_exited; |
|
|
|
} |
|
|
|
|
|
|
|
struct QueueEntry { |
|
|
|
private: |
|
|
|
Thread* prev; |
|
|
|
Thread* next; |
|
|
|
|
|
|
|
class QueueEntry { |
|
|
|
public: |
|
|
|
constexpr QueueEntry() : prev(nullptr), next(nullptr) { /* ... */ |
|
|
|
} |
|
|
|
constexpr QueueEntry() = default; |
|
|
|
|
|
|
|
constexpr void Initialize() { |
|
|
|
this->prev = nullptr; |
|
|
|
@ -590,18 +588,23 @@ public: |
|
|
|
constexpr Thread* GetNext() const { |
|
|
|
return this->next; |
|
|
|
} |
|
|
|
constexpr void SetPrev(Thread* t) { |
|
|
|
this->prev = t; |
|
|
|
constexpr void SetPrev(Thread* thread) { |
|
|
|
this->prev = thread; |
|
|
|
} |
|
|
|
constexpr void SetNext(Thread* t) { |
|
|
|
this->next = t; |
|
|
|
constexpr void SetNext(Thread* thread) { |
|
|
|
this->next = thread; |
|
|
|
} |
|
|
|
|
|
|
|
private: |
|
|
|
Thread* prev{}; |
|
|
|
Thread* next{}; |
|
|
|
}; |
|
|
|
|
|
|
|
constexpr QueueEntry& GetPriorityQueueEntry(s32 core) { |
|
|
|
QueueEntry& GetPriorityQueueEntry(s32 core) { |
|
|
|
return this->per_core_priority_queue_entry[core]; |
|
|
|
} |
|
|
|
constexpr const QueueEntry& GetPriorityQueueEntry(s32 core) const { |
|
|
|
|
|
|
|
const QueueEntry& GetPriorityQueueEntry(s32 core) const { |
|
|
|
return this->per_core_priority_queue_entry[core]; |
|
|
|
} |
|
|
|
|
|
|
|
@ -619,9 +622,6 @@ public: |
|
|
|
disable_count--; |
|
|
|
} |
|
|
|
|
|
|
|
ThreadStatus status = ThreadStatus::Dormant; |
|
|
|
u32 scheduling_state = 0; |
|
|
|
|
|
|
|
private: |
|
|
|
friend class GlobalSchedulerContext; |
|
|
|
friend class KScheduler; |
|
|
|
@ -638,6 +638,9 @@ private: |
|
|
|
ThreadContext64 context_64{}; |
|
|
|
std::shared_ptr<Common::Fiber> host_context{}; |
|
|
|
|
|
|
|
ThreadStatus status = ThreadStatus::Dormant; |
|
|
|
u32 scheduling_state = 0; |
|
|
|
|
|
|
|
u64 thread_id = 0; |
|
|
|
|
|
|
|
VAddr entry_point = 0; |
|
|
|
@ -701,7 +704,7 @@ private: |
|
|
|
|
|
|
|
KScheduler* scheduler = nullptr; |
|
|
|
|
|
|
|
QueueEntry per_core_priority_queue_entry[Core::Hardware::NUM_CPU_CORES]{}; |
|
|
|
std::array<QueueEntry, Core::Hardware::NUM_CPU_CORES> per_core_priority_queue_entry{}; |
|
|
|
|
|
|
|
u32 ideal_core{0xFFFFFFFF}; |
|
|
|
KAffinityMask affinity_mask{}; |
|
|
|
|