mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-30 15:39:02 -05:00 
			
		
		
		
	scheduler: Protect scheduling functions with a global mutex.
This commit is contained in:
		| @@ -9,6 +9,8 @@ | ||||
|  | ||||
| namespace Kernel { | ||||
|  | ||||
| std::mutex Scheduler::scheduler_mutex; | ||||
|  | ||||
| Scheduler::Scheduler(ARM_Interface* cpu_core) : cpu_core(cpu_core) {} | ||||
|  | ||||
| Scheduler::~Scheduler() { | ||||
| @@ -18,6 +20,7 @@ Scheduler::~Scheduler() { | ||||
| } | ||||
|  | ||||
| bool Scheduler::HaveReadyThreads() { | ||||
|     std::lock_guard<std::mutex> lock(scheduler_mutex); | ||||
|     return ready_queue.get_first() != nullptr; | ||||
| } | ||||
|  | ||||
| @@ -90,6 +93,8 @@ void Scheduler::SwitchContext(Thread* new_thread) { | ||||
| } | ||||
|  | ||||
| void Scheduler::Reschedule() { | ||||
|     std::lock_guard<std::mutex> lock(scheduler_mutex); | ||||
|  | ||||
|     Thread* cur = GetCurrentThread(); | ||||
|     Thread* next = PopNextReadyThread(); | ||||
|  | ||||
| @@ -105,26 +110,36 @@ void Scheduler::Reschedule() { | ||||
| } | ||||
|  | ||||
| void Scheduler::AddThread(SharedPtr<Thread> thread, u32 priority) { | ||||
|     std::lock_guard<std::mutex> lock(scheduler_mutex); | ||||
|  | ||||
|     thread_list.push_back(thread); | ||||
|     ready_queue.prepare(priority); | ||||
| } | ||||
|  | ||||
| void Scheduler::RemoveThread(Thread* thread) { | ||||
|     std::lock_guard<std::mutex> lock(scheduler_mutex); | ||||
|  | ||||
|     thread_list.erase(std::remove(thread_list.begin(), thread_list.end(), thread), | ||||
|                       thread_list.end()); | ||||
| } | ||||
|  | ||||
| void Scheduler::ScheduleThread(Thread* thread, u32 priority) { | ||||
|     std::lock_guard<std::mutex> lock(scheduler_mutex); | ||||
|  | ||||
|     ASSERT(thread->status == THREADSTATUS_READY); | ||||
|     ready_queue.push_back(priority, thread); | ||||
| } | ||||
|  | ||||
| void Scheduler::UnscheduleThread(Thread* thread, u32 priority) { | ||||
|     std::lock_guard<std::mutex> lock(scheduler_mutex); | ||||
|  | ||||
|     ASSERT(thread->status == THREADSTATUS_READY); | ||||
|     ready_queue.remove(priority, thread); | ||||
| } | ||||
|  | ||||
| void Scheduler::SetThreadPriority(Thread* thread, u32 priority) { | ||||
|     std::lock_guard<std::mutex> lock(scheduler_mutex); | ||||
|  | ||||
|     // If thread was ready, adjust queues | ||||
|     if (thread->status == THREADSTATUS_READY) | ||||
|         ready_queue.move(thread, thread->current_priority, priority); | ||||
|   | ||||
| @@ -4,6 +4,7 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <mutex> | ||||
| #include <vector> | ||||
| #include "common/common_types.h" | ||||
| #include "common/thread_queue_list.h" | ||||
| @@ -68,6 +69,8 @@ private: | ||||
|     SharedPtr<Thread> current_thread = nullptr; | ||||
|  | ||||
|     ARM_Interface* cpu_core; | ||||
|  | ||||
|     static std::mutex scheduler_mutex; | ||||
| }; | ||||
|  | ||||
| } // namespace Kernel | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei