mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	Merge pull request #10813 from lat9nq/no-atomic-bool
k_thread: Use a mutex and cond_var to sync bool
This commit is contained in:
		@@ -4,6 +4,8 @@
 | 
				
			|||||||
#include <algorithm>
 | 
					#include <algorithm>
 | 
				
			||||||
#include <atomic>
 | 
					#include <atomic>
 | 
				
			||||||
#include <cinttypes>
 | 
					#include <cinttypes>
 | 
				
			||||||
 | 
					#include <condition_variable>
 | 
				
			||||||
 | 
					#include <mutex>
 | 
				
			||||||
#include <optional>
 | 
					#include <optional>
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1313,7 +1315,8 @@ void KThread::RequestDummyThreadWait() {
 | 
				
			|||||||
    ASSERT(this->IsDummyThread());
 | 
					    ASSERT(this->IsDummyThread());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // We will block when the scheduler lock is released.
 | 
					    // We will block when the scheduler lock is released.
 | 
				
			||||||
    m_dummy_thread_runnable.store(false);
 | 
					    std::scoped_lock lock{m_dummy_thread_mutex};
 | 
				
			||||||
 | 
					    m_dummy_thread_runnable = false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void KThread::DummyThreadBeginWait() {
 | 
					void KThread::DummyThreadBeginWait() {
 | 
				
			||||||
@@ -1323,7 +1326,8 @@ void KThread::DummyThreadBeginWait() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Block until runnable is no longer false.
 | 
					    // Block until runnable is no longer false.
 | 
				
			||||||
    m_dummy_thread_runnable.wait(false);
 | 
					    std::unique_lock lock{m_dummy_thread_mutex};
 | 
				
			||||||
 | 
					    m_dummy_thread_cv.wait(lock, [this] { return m_dummy_thread_runnable; });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void KThread::DummyThreadEndWait() {
 | 
					void KThread::DummyThreadEndWait() {
 | 
				
			||||||
@@ -1331,8 +1335,11 @@ void KThread::DummyThreadEndWait() {
 | 
				
			|||||||
    ASSERT(this->IsDummyThread());
 | 
					    ASSERT(this->IsDummyThread());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Wake up the waiting thread.
 | 
					    // Wake up the waiting thread.
 | 
				
			||||||
    m_dummy_thread_runnable.store(true);
 | 
					    {
 | 
				
			||||||
    m_dummy_thread_runnable.notify_one();
 | 
					        std::scoped_lock lock{m_dummy_thread_mutex};
 | 
				
			||||||
 | 
					        m_dummy_thread_runnable = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    m_dummy_thread_cv.notify_one();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void KThread::BeginWait(KThreadQueue* queue) {
 | 
					void KThread::BeginWait(KThreadQueue* queue) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -892,7 +892,9 @@ private:
 | 
				
			|||||||
    std::shared_ptr<Common::Fiber> m_host_context{};
 | 
					    std::shared_ptr<Common::Fiber> m_host_context{};
 | 
				
			||||||
    ThreadType m_thread_type{};
 | 
					    ThreadType m_thread_type{};
 | 
				
			||||||
    StepState m_step_state{};
 | 
					    StepState m_step_state{};
 | 
				
			||||||
    std::atomic<bool> m_dummy_thread_runnable{true};
 | 
					    bool m_dummy_thread_runnable{true};
 | 
				
			||||||
 | 
					    std::mutex m_dummy_thread_mutex{};
 | 
				
			||||||
 | 
					    std::condition_variable m_dummy_thread_cv{};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // For debugging
 | 
					    // For debugging
 | 
				
			||||||
    std::vector<KSynchronizationObject*> m_wait_objects_for_debugging{};
 | 
					    std::vector<KSynchronizationObject*> m_wait_objects_for_debugging{};
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user