mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	hle/scheduler: Fix data race in is_context_switch_pending
As reported by tsan, SelectThreads could write to is_context_switch_pending holding a mutex while SwitchToCurrent reads it without holding any. It is assumed that the author didn't want an atomic here, so the code is reordered so that whenever is_context_switch_pending is read inside SwitchToContext, the mutex is locked.
This commit is contained in:
		
							parent
							
								
									4efaecf125
								
							
						
					
					
						commit
						ccdd84a778
					
				| @ -756,7 +756,11 @@ void Scheduler::SwitchToCurrent() { | ||||
|             current_thread = selected_thread; | ||||
|             is_context_switch_pending = false; | ||||
|         } | ||||
|         while (!is_context_switch_pending) { | ||||
|         const auto is_switch_pending = [this] { | ||||
|             std::scoped_lock lock{guard}; | ||||
|             return is_context_switch_pending; | ||||
|         }; | ||||
|         do { | ||||
|             if (current_thread != nullptr && !current_thread->IsHLEThread()) { | ||||
|                 current_thread->context_guard.lock(); | ||||
|                 if (!current_thread->IsRunnable()) { | ||||
| @ -775,7 +779,7 @@ void Scheduler::SwitchToCurrent() { | ||||
|                 next_context = &idle_thread->GetHostContext(); | ||||
|             } | ||||
|             Common::Fiber::YieldTo(switch_fiber, *next_context); | ||||
|         } | ||||
|         } while (!is_switch_pending()); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 ReinUsesLisp
						ReinUsesLisp