yuzu-emu
/
yuzu
Archived
1
0
Fork 0

k_thread: Fix data race

TSan reports a data race between writing at cpp:1162 and reading at
h:262. Make the thread_state atomic to prevent this.
This commit is contained in:
lat9nq 2022-04-01 18:57:40 -04:00
parent d6a0666268
commit 6bcbbb29e7
2 changed files with 4 additions and 3 deletions

View File

@ -723,7 +723,7 @@ void KThread::UpdateState() {
ASSERT(kernel.GlobalSchedulerContext().IsLocked()); ASSERT(kernel.GlobalSchedulerContext().IsLocked());
// Set our suspend flags in state. // Set our suspend flags in state.
const auto old_state = thread_state; const ThreadState old_state = thread_state;
const auto new_state = const auto new_state =
static_cast<ThreadState>(this->GetSuspendFlags()) | (old_state & ThreadState::Mask); static_cast<ThreadState>(this->GetSuspendFlags()) | (old_state & ThreadState::Mask);
thread_state = new_state; thread_state = new_state;
@ -738,7 +738,7 @@ void KThread::Continue() {
ASSERT(kernel.GlobalSchedulerContext().IsLocked()); ASSERT(kernel.GlobalSchedulerContext().IsLocked());
// Clear our suspend flags in state. // Clear our suspend flags in state.
const auto old_state = thread_state; const ThreadState old_state = thread_state;
thread_state = old_state & ThreadState::Mask; thread_state = old_state & ThreadState::Mask;
// Note the state change in scheduler. // Note the state change in scheduler.

View File

@ -5,6 +5,7 @@
#pragma once #pragma once
#include <array> #include <array>
#include <atomic>
#include <span> #include <span>
#include <string> #include <string>
#include <utility> #include <utility>
@ -751,7 +752,7 @@ private:
KAffinityMask original_physical_affinity_mask{}; KAffinityMask original_physical_affinity_mask{};
s32 original_physical_ideal_core_id{}; s32 original_physical_ideal_core_id{};
s32 num_core_migration_disables{}; s32 num_core_migration_disables{};
ThreadState thread_state{}; std::atomic<ThreadState> thread_state{};
std::atomic<bool> termination_requested{}; std::atomic<bool> termination_requested{};
bool wait_cancelled{}; bool wait_cancelled{};
bool cancellable{}; bool cancellable{};