diff options
| author | 2022-04-01 18:57:40 -0400 | |
|---|---|---|
| committer | 2022-04-03 21:47:58 -0400 | |
| commit | 6bcbbb29e7822f5ebd6ac985066dfdd0890492f0 (patch) | |
| tree | d903d0ab561c399600819b81e0b5823044ad7922 /src | |
| parent | k_process: Fix data race (diff) | |
| download | yuzu-6bcbbb29e7822f5ebd6ac985066dfdd0890492f0.tar.gz yuzu-6bcbbb29e7822f5ebd6ac985066dfdd0890492f0.tar.xz yuzu-6bcbbb29e7822f5ebd6ac985066dfdd0890492f0.zip | |
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')
| -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() { | |||
| 723 | ASSERT(kernel.GlobalSchedulerContext().IsLocked()); | 723 | ASSERT(kernel.GlobalSchedulerContext().IsLocked()); |
| 724 | 724 | ||
| 725 | // Set our suspend flags in state. | 725 | // Set our suspend flags in state. |
| 726 | const auto old_state = thread_state; | 726 | const ThreadState old_state = thread_state; |
| 727 | const auto new_state = | 727 | const auto new_state = |
| 728 | static_cast<ThreadState>(this->GetSuspendFlags()) | (old_state & ThreadState::Mask); | 728 | static_cast<ThreadState>(this->GetSuspendFlags()) | (old_state & ThreadState::Mask); |
| 729 | thread_state = new_state; | 729 | thread_state = new_state; |
| @@ -738,7 +738,7 @@ void KThread::Continue() { | |||
| 738 | ASSERT(kernel.GlobalSchedulerContext().IsLocked()); | 738 | ASSERT(kernel.GlobalSchedulerContext().IsLocked()); |
| 739 | 739 | ||
| 740 | // Clear our suspend flags in state. | 740 | // Clear our suspend flags in state. |
| 741 | const auto old_state = thread_state; | 741 | const ThreadState old_state = thread_state; |
| 742 | thread_state = old_state & ThreadState::Mask; | 742 | thread_state = old_state & ThreadState::Mask; |
| 743 | 743 | ||
| 744 | // Note the state change in scheduler. | 744 | // 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 @@ | |||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <array> | 7 | #include <array> |
| 8 | #include <atomic> | ||
| 8 | #include <span> | 9 | #include <span> |
| 9 | #include <string> | 10 | #include <string> |
| 10 | #include <utility> | 11 | #include <utility> |
| @@ -751,7 +752,7 @@ private: | |||
| 751 | KAffinityMask original_physical_affinity_mask{}; | 752 | KAffinityMask original_physical_affinity_mask{}; |
| 752 | s32 original_physical_ideal_core_id{}; | 753 | s32 original_physical_ideal_core_id{}; |
| 753 | s32 num_core_migration_disables{}; | 754 | s32 num_core_migration_disables{}; |
| 754 | ThreadState thread_state{}; | 755 | std::atomic<ThreadState> thread_state{}; |
| 755 | std::atomic<bool> termination_requested{}; | 756 | std::atomic<bool> termination_requested{}; |
| 756 | bool wait_cancelled{}; | 757 | bool wait_cancelled{}; |
| 757 | bool cancellable{}; | 758 | bool cancellable{}; |