mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Mutex: Fix a bug where the thread should not wait if it already has the mutex.
This commit is contained in:
		
							parent
							
								
									9412996c8f
								
							
						
					
					
						commit
						dde02f79af
					
				
					 1 changed files with 4 additions and 1 deletions
				
			
		|  | @ -25,6 +25,7 @@ public: | |||
|     bool locked;                                ///< Current locked state
 | ||||
|     Handle lock_thread;                         ///< Handle to thread that currently has mutex
 | ||||
|     std::string name;                           ///< Name of mutex (optional)
 | ||||
|     SharedPtr<Thread> current_thread;           ///< Thread that has acquired the mutex
 | ||||
| 
 | ||||
|     ResultVal<bool> Wait() override; | ||||
|     ResultVal<bool> Acquire() override; | ||||
|  | @ -43,6 +44,7 @@ static MutexMap g_mutex_held_locks; | |||
| void MutexAcquireLock(Mutex* mutex, Handle thread = GetCurrentThread()->GetHandle()) { | ||||
|     g_mutex_held_locks.insert(std::make_pair(thread, mutex->GetHandle())); | ||||
|     mutex->lock_thread = thread; | ||||
|     mutex->current_thread = Kernel::g_handle_table.Get<Thread>(thread); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -132,6 +134,7 @@ Mutex* CreateMutex(Handle& handle, bool initial_locked, const std::string& name) | |||
| 
 | ||||
|     mutex->locked = mutex->initial_locked = initial_locked; | ||||
|     mutex->name = name; | ||||
|     mutex->current_thread = nullptr; | ||||
| 
 | ||||
|     // Acquire mutex with current thread if initialized as locked...
 | ||||
|     if (mutex->locked) { | ||||
|  | @ -157,7 +160,7 @@ Handle CreateMutex(bool initial_locked, const std::string& name) { | |||
| } | ||||
| 
 | ||||
| ResultVal<bool> Mutex::Wait() { | ||||
|     return MakeResult<bool>(locked); | ||||
|     return MakeResult<bool>(locked && (current_thread != GetCurrentThread())); | ||||
| } | ||||
| 
 | ||||
| ResultVal<bool> Mutex::Acquire() { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue