diff options
| author | 2020-08-26 01:45:51 +0000 | |
|---|---|---|
| committer | 2020-08-26 02:52:50 +0000 | |
| commit | 36eade7f4ccf5a7da8e9f5e7ec32d2e4f8660e85 (patch) | |
| tree | e1da56066795a232d4f23f4c33e0d758943dfaa8 /src/core/hle/kernel/kernel.cpp | |
| parent | Merge pull request #4572 from lioncash/xbyak (diff) | |
| download | yuzu-36eade7f4ccf5a7da8e9f5e7ec32d2e4f8660e85.tar.gz yuzu-36eade7f4ccf5a7da8e9f5e7ec32d2e4f8660e85.tar.xz yuzu-36eade7f4ccf5a7da8e9f5e7ec32d2e4f8660e85.zip | |
hle/kernel: Fix data race in GetCurrentHostThreadID
As reported by tsan, host_thread_ids could be read while
any of the RegisterHostThread variants were called.
To fix this, lock the register mutex when yuzu is running in multicore
mode and GetCurrentHostThreadID is called.
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index cabe8d418..f2b0fe2fd 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -219,6 +219,7 @@ struct KernelCore::Impl { | |||
| 219 | return static_cast<u32>(system.GetCpuManager().CurrentCore()); | 219 | return static_cast<u32>(system.GetCpuManager().CurrentCore()); |
| 220 | } | 220 | } |
| 221 | } | 221 | } |
| 222 | std::unique_lock lock{register_thread_mutex}; | ||
| 222 | const auto it = host_thread_ids.find(this_id); | 223 | const auto it = host_thread_ids.find(this_id); |
| 223 | if (it == host_thread_ids.end()) { | 224 | if (it == host_thread_ids.end()) { |
| 224 | return Core::INVALID_HOST_THREAD_ID; | 225 | return Core::INVALID_HOST_THREAD_ID; |
| @@ -324,7 +325,7 @@ struct KernelCore::Impl { | |||
| 324 | std::unordered_map<std::thread::id, u32> host_thread_ids; | 325 | std::unordered_map<std::thread::id, u32> host_thread_ids; |
| 325 | u32 registered_thread_ids{Core::Hardware::NUM_CPU_CORES}; | 326 | u32 registered_thread_ids{Core::Hardware::NUM_CPU_CORES}; |
| 326 | std::bitset<Core::Hardware::NUM_CPU_CORES> registered_core_threads; | 327 | std::bitset<Core::Hardware::NUM_CPU_CORES> registered_core_threads; |
| 327 | std::mutex register_thread_mutex; | 328 | mutable std::mutex register_thread_mutex; |
| 328 | 329 | ||
| 329 | // Kernel memory management | 330 | // Kernel memory management |
| 330 | std::unique_ptr<Memory::MemoryManager> memory_manager; | 331 | std::unique_ptr<Memory::MemoryManager> memory_manager; |