2018-02-18 20:58:40 +01:00
|
|
|
// Copyright 2018 yuzu emulator team
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2018-05-08 04:12:45 +02:00
|
|
|
#include <mutex>
|
2018-02-18 20:58:40 +01:00
|
|
|
#include <vector>
|
|
|
|
#include "common/common_types.h"
|
|
|
|
#include "common/thread_queue_list.h"
|
2018-08-02 04:40:00 +02:00
|
|
|
#include "core/hle/kernel/object.h"
|
2018-02-18 20:58:40 +01:00
|
|
|
#include "core/hle/kernel/thread.h"
|
|
|
|
|
2018-07-31 14:06:09 +02:00
|
|
|
class ARM_Interface;
|
|
|
|
|
2018-02-18 20:58:40 +01:00
|
|
|
namespace Kernel {
|
|
|
|
|
|
|
|
class Scheduler final {
|
|
|
|
public:
|
2018-02-19 22:46:42 +01:00
|
|
|
explicit Scheduler(ARM_Interface* cpu_core);
|
2018-02-18 20:58:40 +01:00
|
|
|
~Scheduler();
|
|
|
|
|
|
|
|
/// Returns whether there are any threads that are ready to run.
|
2018-08-12 18:55:56 +02:00
|
|
|
bool HaveReadyThreads() const;
|
2018-02-18 20:58:40 +01:00
|
|
|
|
|
|
|
/// Reschedules to the next available thread (call after current thread is suspended)
|
|
|
|
void Reschedule();
|
|
|
|
|
|
|
|
/// Gets the current running thread
|
|
|
|
Thread* GetCurrentThread() const;
|
|
|
|
|
|
|
|
/// Adds a new thread to the scheduler
|
|
|
|
void AddThread(SharedPtr<Thread> thread, u32 priority);
|
|
|
|
|
|
|
|
/// Removes a thread from the scheduler
|
|
|
|
void RemoveThread(Thread* thread);
|
|
|
|
|
|
|
|
/// Schedules a thread that has become "ready"
|
|
|
|
void ScheduleThread(Thread* thread, u32 priority);
|
|
|
|
|
|
|
|
/// Unschedules a thread that was already scheduled
|
|
|
|
void UnscheduleThread(Thread* thread, u32 priority);
|
|
|
|
|
|
|
|
/// Sets the priority of a thread in the scheduler
|
|
|
|
void SetThreadPriority(Thread* thread, u32 priority);
|
|
|
|
|
|
|
|
/// Returns a list of all threads managed by the scheduler
|
|
|
|
const std::vector<SharedPtr<Thread>>& GetThreadList() const {
|
|
|
|
return thread_list;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
/**
|
|
|
|
* Pops and returns the next thread from the thread queue
|
|
|
|
* @return A pointer to the next ready thread
|
|
|
|
*/
|
|
|
|
Thread* PopNextReadyThread();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Switches the CPU's active thread context to that of the specified thread
|
|
|
|
* @param new_thread The thread to switch to
|
|
|
|
*/
|
|
|
|
void SwitchContext(Thread* new_thread);
|
|
|
|
|
|
|
|
/// Lists all thread ids that aren't deleted/etc.
|
|
|
|
std::vector<SharedPtr<Thread>> thread_list;
|
|
|
|
|
|
|
|
/// Lists only ready thread ids.
|
|
|
|
Common::ThreadQueueList<Thread*, THREADPRIO_LOWEST + 1> ready_queue;
|
|
|
|
|
|
|
|
SharedPtr<Thread> current_thread = nullptr;
|
|
|
|
|
2018-02-19 22:46:42 +01:00
|
|
|
ARM_Interface* cpu_core;
|
2018-05-08 04:12:45 +02:00
|
|
|
|
|
|
|
static std::mutex scheduler_mutex;
|
2018-02-18 20:58:40 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace Kernel
|