mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	SVC: Update various SVCs to cause a reschedule.
- CreateMutex/ReleaseMutex/ReleaseSemaphore/SetTimer/CancelTimer/ArbitrateAddress
This commit is contained in:
		
							parent
							
								
									9c3419ebcc
								
							
						
					
					
						commit
						c077bcefa9
					
				
					 2 changed files with 22 additions and 6 deletions
				
			
		|  | @ -46,14 +46,12 @@ ResultCode AddressArbiter::ArbitrateAddress(ArbitrationType type, VAddr address, | |||
|     case ArbitrationType::WaitIfLessThan: | ||||
|         if ((s32)Memory::Read32(address) <= value) { | ||||
|             Kernel::WaitCurrentThread_ArbitrateAddress(address); | ||||
|             HLE::Reschedule(__func__); | ||||
|         } | ||||
|         break; | ||||
|     case ArbitrationType::WaitIfLessThanWithTimeout: | ||||
|         if ((s32)Memory::Read32(address) <= value) { | ||||
|             Kernel::WaitCurrentThread_ArbitrateAddress(address); | ||||
|             GetCurrentThread()->WakeAfterDelay(nanoseconds); | ||||
|             HLE::Reschedule(__func__); | ||||
|         } | ||||
|         break; | ||||
|     case ArbitrationType::DecrementAndWaitIfLessThan: | ||||
|  | @ -62,7 +60,6 @@ ResultCode AddressArbiter::ArbitrateAddress(ArbitrationType type, VAddr address, | |||
|         Memory::Write32(address, memory_value); | ||||
|         if (memory_value <= value) { | ||||
|             Kernel::WaitCurrentThread_ArbitrateAddress(address); | ||||
|             HLE::Reschedule(__func__); | ||||
|         } | ||||
|         break; | ||||
|     } | ||||
|  | @ -73,7 +70,6 @@ ResultCode AddressArbiter::ArbitrateAddress(ArbitrationType type, VAddr address, | |||
|         if (memory_value <= value) { | ||||
|             Kernel::WaitCurrentThread_ArbitrateAddress(address); | ||||
|             GetCurrentThread()->WakeAfterDelay(nanoseconds); | ||||
|             HLE::Reschedule(__func__); | ||||
|         } | ||||
|         break; | ||||
|     } | ||||
|  |  | |||
|  | @ -283,8 +283,13 @@ static ResultCode ArbitrateAddress(Handle handle, u32 address, u32 type, u32 val | |||
|     if (arbiter == nullptr) | ||||
|         return ERR_INVALID_HANDLE; | ||||
| 
 | ||||
|     return arbiter->ArbitrateAddress(static_cast<Kernel::ArbitrationType>(type), | ||||
|     auto res = arbiter->ArbitrateAddress(static_cast<Kernel::ArbitrationType>(type), | ||||
|                                          address, value, nanoseconds); | ||||
| 
 | ||||
|     if (res == RESULT_SUCCESS) | ||||
|         HLE::Reschedule(__func__); | ||||
| 
 | ||||
|     return res; | ||||
| } | ||||
| 
 | ||||
| /// Used to output a message on a debug hardware unit - does nothing on a retail unit
 | ||||
|  | @ -386,8 +391,11 @@ static ResultCode CreateMutex(Handle* out_handle, u32 initial_locked) { | |||
|     SharedPtr<Mutex> mutex = Mutex::Create(initial_locked != 0); | ||||
|     CASCADE_RESULT(*out_handle, Kernel::g_handle_table.Create(std::move(mutex))); | ||||
| 
 | ||||
|     HLE::Reschedule(__func__); | ||||
| 
 | ||||
|     LOG_TRACE(Kernel_SVC, "called initial_locked=%s : created handle=0x%08X", | ||||
|         initial_locked ? "true" : "false", *out_handle); | ||||
|      | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| 
 | ||||
|  | @ -402,6 +410,9 @@ static ResultCode ReleaseMutex(Handle handle) { | |||
|         return ERR_INVALID_HANDLE; | ||||
| 
 | ||||
|     mutex->Release(); | ||||
| 
 | ||||
|     HLE::Reschedule(__func__); | ||||
| 
 | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| 
 | ||||
|  | @ -440,6 +451,9 @@ static ResultCode ReleaseSemaphore(s32* count, Handle handle, s32 release_count) | |||
|         return ERR_INVALID_HANDLE; | ||||
| 
 | ||||
|     CASCADE_RESULT(*count, semaphore->Release(release_count)); | ||||
| 
 | ||||
|     HLE::Reschedule(__func__); | ||||
| 
 | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| 
 | ||||
|  | @ -532,6 +546,9 @@ static ResultCode SetTimer(Handle handle, s64 initial, s64 interval) { | |||
|         return ERR_INVALID_HANDLE; | ||||
| 
 | ||||
|     timer->Set(initial, interval); | ||||
| 
 | ||||
|     HLE::Reschedule(__func__); | ||||
| 
 | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| 
 | ||||
|  | @ -546,6 +563,9 @@ static ResultCode CancelTimer(Handle handle) { | |||
|         return ERR_INVALID_HANDLE; | ||||
| 
 | ||||
|     timer->Cancel(); | ||||
| 
 | ||||
|     HLE::Reschedule(__func__); | ||||
| 
 | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue