diff options
| -rw-r--r-- | src/core/hle/kernel/scheduler.cpp | 15 | ||||
| -rw-r--r-- | src/core/hle/kernel/scheduler.h | 3 |
2 files changed, 18 insertions, 0 deletions
diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp index ff6a0941a..9cb9e0e5c 100644 --- a/src/core/hle/kernel/scheduler.cpp +++ b/src/core/hle/kernel/scheduler.cpp | |||
| @@ -9,6 +9,8 @@ | |||
| 9 | 9 | ||
| 10 | namespace Kernel { | 10 | namespace Kernel { |
| 11 | 11 | ||
| 12 | std::mutex Scheduler::scheduler_mutex; | ||
| 13 | |||
| 12 | Scheduler::Scheduler(ARM_Interface* cpu_core) : cpu_core(cpu_core) {} | 14 | Scheduler::Scheduler(ARM_Interface* cpu_core) : cpu_core(cpu_core) {} |
| 13 | 15 | ||
| 14 | Scheduler::~Scheduler() { | 16 | Scheduler::~Scheduler() { |
| @@ -18,6 +20,7 @@ Scheduler::~Scheduler() { | |||
| 18 | } | 20 | } |
| 19 | 21 | ||
| 20 | bool Scheduler::HaveReadyThreads() { | 22 | bool Scheduler::HaveReadyThreads() { |
| 23 | std::lock_guard<std::mutex> lock(scheduler_mutex); | ||
| 21 | return ready_queue.get_first() != nullptr; | 24 | return ready_queue.get_first() != nullptr; |
| 22 | } | 25 | } |
| 23 | 26 | ||
| @@ -90,6 +93,8 @@ void Scheduler::SwitchContext(Thread* new_thread) { | |||
| 90 | } | 93 | } |
| 91 | 94 | ||
| 92 | void Scheduler::Reschedule() { | 95 | void Scheduler::Reschedule() { |
| 96 | std::lock_guard<std::mutex> lock(scheduler_mutex); | ||
| 97 | |||
| 93 | Thread* cur = GetCurrentThread(); | 98 | Thread* cur = GetCurrentThread(); |
| 94 | Thread* next = PopNextReadyThread(); | 99 | Thread* next = PopNextReadyThread(); |
| 95 | 100 | ||
| @@ -105,26 +110,36 @@ void Scheduler::Reschedule() { | |||
| 105 | } | 110 | } |
| 106 | 111 | ||
| 107 | void Scheduler::AddThread(SharedPtr<Thread> thread, u32 priority) { | 112 | void Scheduler::AddThread(SharedPtr<Thread> thread, u32 priority) { |
| 113 | std::lock_guard<std::mutex> lock(scheduler_mutex); | ||
| 114 | |||
| 108 | thread_list.push_back(thread); | 115 | thread_list.push_back(thread); |
| 109 | ready_queue.prepare(priority); | 116 | ready_queue.prepare(priority); |
| 110 | } | 117 | } |
| 111 | 118 | ||
| 112 | void Scheduler::RemoveThread(Thread* thread) { | 119 | void Scheduler::RemoveThread(Thread* thread) { |
| 120 | std::lock_guard<std::mutex> lock(scheduler_mutex); | ||
| 121 | |||
| 113 | thread_list.erase(std::remove(thread_list.begin(), thread_list.end(), thread), | 122 | thread_list.erase(std::remove(thread_list.begin(), thread_list.end(), thread), |
| 114 | thread_list.end()); | 123 | thread_list.end()); |
| 115 | } | 124 | } |
| 116 | 125 | ||
| 117 | void Scheduler::ScheduleThread(Thread* thread, u32 priority) { | 126 | void Scheduler::ScheduleThread(Thread* thread, u32 priority) { |
| 127 | std::lock_guard<std::mutex> lock(scheduler_mutex); | ||
| 128 | |||
| 118 | ASSERT(thread->status == THREADSTATUS_READY); | 129 | ASSERT(thread->status == THREADSTATUS_READY); |
| 119 | ready_queue.push_back(priority, thread); | 130 | ready_queue.push_back(priority, thread); |
| 120 | } | 131 | } |
| 121 | 132 | ||
| 122 | void Scheduler::UnscheduleThread(Thread* thread, u32 priority) { | 133 | void Scheduler::UnscheduleThread(Thread* thread, u32 priority) { |
| 134 | std::lock_guard<std::mutex> lock(scheduler_mutex); | ||
| 135 | |||
| 123 | ASSERT(thread->status == THREADSTATUS_READY); | 136 | ASSERT(thread->status == THREADSTATUS_READY); |
| 124 | ready_queue.remove(priority, thread); | 137 | ready_queue.remove(priority, thread); |
| 125 | } | 138 | } |
| 126 | 139 | ||
| 127 | void Scheduler::SetThreadPriority(Thread* thread, u32 priority) { | 140 | void Scheduler::SetThreadPriority(Thread* thread, u32 priority) { |
| 141 | std::lock_guard<std::mutex> lock(scheduler_mutex); | ||
| 142 | |||
| 128 | // If thread was ready, adjust queues | 143 | // If thread was ready, adjust queues |
| 129 | if (thread->status == THREADSTATUS_READY) | 144 | if (thread->status == THREADSTATUS_READY) |
| 130 | ready_queue.move(thread, thread->current_priority, priority); | 145 | ready_queue.move(thread, thread->current_priority, priority); |
diff --git a/src/core/hle/kernel/scheduler.h b/src/core/hle/kernel/scheduler.h index 27d0247d6..a3b5fb8ca 100644 --- a/src/core/hle/kernel/scheduler.h +++ b/src/core/hle/kernel/scheduler.h | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <mutex> | ||
| 7 | #include <vector> | 8 | #include <vector> |
| 8 | #include "common/common_types.h" | 9 | #include "common/common_types.h" |
| 9 | #include "common/thread_queue_list.h" | 10 | #include "common/thread_queue_list.h" |
| @@ -68,6 +69,8 @@ private: | |||
| 68 | SharedPtr<Thread> current_thread = nullptr; | 69 | SharedPtr<Thread> current_thread = nullptr; |
| 69 | 70 | ||
| 70 | ARM_Interface* cpu_core; | 71 | ARM_Interface* cpu_core; |
| 72 | |||
| 73 | static std::mutex scheduler_mutex; | ||
| 71 | }; | 74 | }; |
| 72 | 75 | ||
| 73 | } // namespace Kernel | 76 | } // namespace Kernel |