yuzu-emu
/
yuzu
Archived
1
0
Fork 0

Kernel: Make global scheduler depend on KernelCore

This commit is contained in:
Fernando Sahmkow 2020-02-13 22:04:10 -04:00 committed by FernandoS27
parent d4da52bbd9
commit 0728dfef84
4 changed files with 24 additions and 8 deletions

View File

@ -97,8 +97,8 @@ static void ThreadWakeupCallback(u64 thread_handle, [[maybe_unused]] s64 cycles_
} }
struct KernelCore::Impl { struct KernelCore::Impl {
explicit Impl(Core::System& system) explicit Impl(Core::System& system, KernelCore& kernel)
: system{system}, global_scheduler{system}, synchronization{system} {} : system{system}, global_scheduler{kernel}, synchronization{system} {}
void Initialize(KernelCore& kernel) { void Initialize(KernelCore& kernel) {
Shutdown(); Shutdown();
@ -215,7 +215,7 @@ struct KernelCore::Impl {
Core::System& system; Core::System& system;
}; };
KernelCore::KernelCore(Core::System& system) : impl{std::make_unique<Impl>(system)} {} KernelCore::KernelCore(Core::System& system) : impl{std::make_unique<Impl>(system, *this)} {}
KernelCore::~KernelCore() { KernelCore::~KernelCore() {
Shutdown(); Shutdown();
} }
@ -265,6 +265,14 @@ const Kernel::GlobalScheduler& KernelCore::GlobalScheduler() const {
return impl->global_scheduler; return impl->global_scheduler;
} }
Kernel::Scheduler& KernelCore::Scheduler(std::size_t id) {
return impl->cores[id].Scheduler();
}
const Kernel::Scheduler& KernelCore::Scheduler(std::size_t id) const {
return impl->cores[id].Scheduler();
}
Kernel::PhysicalCore& KernelCore::PhysicalCore(std::size_t id) { Kernel::PhysicalCore& KernelCore::PhysicalCore(std::size_t id) {
return impl->cores[id]; return impl->cores[id];
} }

View File

@ -29,6 +29,7 @@ class HandleTable;
class PhysicalCore; class PhysicalCore;
class Process; class Process;
class ResourceLimit; class ResourceLimit;
class Scheduler;
class Synchronization; class Synchronization;
class Thread; class Thread;
@ -87,6 +88,12 @@ public:
/// Gets the sole instance of the global scheduler /// Gets the sole instance of the global scheduler
const Kernel::GlobalScheduler& GlobalScheduler() const; const Kernel::GlobalScheduler& GlobalScheduler() const;
/// Gets the sole instance of the Scheduler assoviated with cpu core 'id'
Kernel::Scheduler& Scheduler(std::size_t id);
/// Gets the sole instance of the Scheduler assoviated with cpu core 'id'
const Kernel::Scheduler& Scheduler(std::size_t id) const;
/// Gets the an instance of the respective physical CPU core. /// Gets the an instance of the respective physical CPU core.
Kernel::PhysicalCore& PhysicalCore(std::size_t id); Kernel::PhysicalCore& PhysicalCore(std::size_t id);

View File

@ -21,7 +21,7 @@
namespace Kernel { namespace Kernel {
GlobalScheduler::GlobalScheduler(Core::System& system) : system{system} {} GlobalScheduler::GlobalScheduler(KernelCore& kernel) : kernel{kernel} {}
GlobalScheduler::~GlobalScheduler() = default; GlobalScheduler::~GlobalScheduler() = default;
@ -35,7 +35,7 @@ void GlobalScheduler::RemoveThread(std::shared_ptr<Thread> thread) {
} }
void GlobalScheduler::UnloadThread(std::size_t core) { void GlobalScheduler::UnloadThread(std::size_t core) {
Scheduler& sched = system.Scheduler(core); Scheduler& sched = kernel.Scheduler(core);
sched.UnloadThread(); sched.UnloadThread();
} }
@ -50,7 +50,7 @@ void GlobalScheduler::SelectThread(std::size_t core) {
sched.is_context_switch_pending = sched.selected_thread != sched.current_thread; sched.is_context_switch_pending = sched.selected_thread != sched.current_thread;
std::atomic_thread_fence(std::memory_order_seq_cst); std::atomic_thread_fence(std::memory_order_seq_cst);
}; };
Scheduler& sched = system.Scheduler(core); Scheduler& sched = kernel.Scheduler(core);
Thread* current_thread = nullptr; Thread* current_thread = nullptr;
// Step 1: Get top thread in schedule queue. // Step 1: Get top thread in schedule queue.
current_thread = scheduled_queue[core].empty() ? nullptr : scheduled_queue[core].front(); current_thread = scheduled_queue[core].empty() ? nullptr : scheduled_queue[core].front();

View File

@ -20,11 +20,12 @@ class System;
namespace Kernel { namespace Kernel {
class KernelCore;
class Process; class Process;
class GlobalScheduler final { class GlobalScheduler final {
public: public:
explicit GlobalScheduler(Core::System& system); explicit GlobalScheduler(KernelCore& kernel);
~GlobalScheduler(); ~GlobalScheduler();
/// Adds a new thread to the scheduler /// Adds a new thread to the scheduler
@ -160,7 +161,7 @@ private:
/// Lists all thread ids that aren't deleted/etc. /// Lists all thread ids that aren't deleted/etc.
std::vector<std::shared_ptr<Thread>> thread_list; std::vector<std::shared_ptr<Thread>> thread_list;
Core::System& system; KernelCore& kernel;
}; };
class Scheduler final { class Scheduler final {