diff options
| author | lat9nq <lat9nq@gmail.com> | 2022-04-01 18:57:40 -0400 | 
|---|---|---|
| committer | lat9nq <lat9nq@gmail.com> | 2022-04-03 21:47:58 -0400 | 
| commit | 6bcbbb29e7822f5ebd6ac985066dfdd0890492f0 (patch) | |
| tree | d903d0ab561c399600819b81e0b5823044ad7922 /src/core/hle/kernel | |
| parent | d6a0666268d5ef51936c2475d33ab37ff14462e4 (diff) | |
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.
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/k_thread.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_thread.h | 3 | 
2 files changed, 4 insertions, 3 deletions
diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp index 94c8faf68..d3bb1c871 100644 --- a/src/core/hle/kernel/k_thread.cpp +++ b/src/core/hle/kernel/k_thread.cpp @@ -723,7 +723,7 @@ void KThread::UpdateState() {      ASSERT(kernel.GlobalSchedulerContext().IsLocked());      // Set our suspend flags in state. -    const auto old_state = thread_state; +    const ThreadState old_state = thread_state;      const auto new_state =          static_cast<ThreadState>(this->GetSuspendFlags()) | (old_state & ThreadState::Mask);      thread_state = new_state; @@ -738,7 +738,7 @@ void KThread::Continue() {      ASSERT(kernel.GlobalSchedulerContext().IsLocked());      // Clear our suspend flags in state. -    const auto old_state = thread_state; +    const ThreadState old_state = thread_state;      thread_state = old_state & ThreadState::Mask;      // Note the state change in scheduler. diff --git a/src/core/hle/kernel/k_thread.h b/src/core/hle/kernel/k_thread.h index f46db7298..d0fd85130 100644 --- a/src/core/hle/kernel/k_thread.h +++ b/src/core/hle/kernel/k_thread.h @@ -5,6 +5,7 @@  #pragma once  #include <array> +#include <atomic>  #include <span>  #include <string>  #include <utility> @@ -751,7 +752,7 @@ private:      KAffinityMask original_physical_affinity_mask{};      s32 original_physical_ideal_core_id{};      s32 num_core_migration_disables{}; -    ThreadState thread_state{}; +    std::atomic<ThreadState> thread_state{};      std::atomic<bool> termination_requested{};      bool wait_cancelled{};      bool cancellable{};  | 
