mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +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: |     case ArbitrationType::WaitIfLessThan: | ||||||
|         if ((s32)Memory::Read32(address) <= value) { |         if ((s32)Memory::Read32(address) <= value) { | ||||||
|             Kernel::WaitCurrentThread_ArbitrateAddress(address); |             Kernel::WaitCurrentThread_ArbitrateAddress(address); | ||||||
|             HLE::Reschedule(__func__); |  | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|     case ArbitrationType::WaitIfLessThanWithTimeout: |     case ArbitrationType::WaitIfLessThanWithTimeout: | ||||||
|         if ((s32)Memory::Read32(address) <= value) { |         if ((s32)Memory::Read32(address) <= value) { | ||||||
|             Kernel::WaitCurrentThread_ArbitrateAddress(address); |             Kernel::WaitCurrentThread_ArbitrateAddress(address); | ||||||
|             GetCurrentThread()->WakeAfterDelay(nanoseconds); |             GetCurrentThread()->WakeAfterDelay(nanoseconds); | ||||||
|             HLE::Reschedule(__func__); |  | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|     case ArbitrationType::DecrementAndWaitIfLessThan: |     case ArbitrationType::DecrementAndWaitIfLessThan: | ||||||
|  | @ -62,7 +60,6 @@ ResultCode AddressArbiter::ArbitrateAddress(ArbitrationType type, VAddr address, | ||||||
|         Memory::Write32(address, memory_value); |         Memory::Write32(address, memory_value); | ||||||
|         if (memory_value <= value) { |         if (memory_value <= value) { | ||||||
|             Kernel::WaitCurrentThread_ArbitrateAddress(address); |             Kernel::WaitCurrentThread_ArbitrateAddress(address); | ||||||
|             HLE::Reschedule(__func__); |  | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  | @ -73,7 +70,6 @@ ResultCode AddressArbiter::ArbitrateAddress(ArbitrationType type, VAddr address, | ||||||
|         if (memory_value <= value) { |         if (memory_value <= value) { | ||||||
|             Kernel::WaitCurrentThread_ArbitrateAddress(address); |             Kernel::WaitCurrentThread_ArbitrateAddress(address); | ||||||
|             GetCurrentThread()->WakeAfterDelay(nanoseconds); |             GetCurrentThread()->WakeAfterDelay(nanoseconds); | ||||||
|             HLE::Reschedule(__func__); |  | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -283,8 +283,13 @@ static ResultCode ArbitrateAddress(Handle handle, u32 address, u32 type, u32 val | ||||||
|     if (arbiter == nullptr) |     if (arbiter == nullptr) | ||||||
|         return ERR_INVALID_HANDLE; |         return ERR_INVALID_HANDLE; | ||||||
| 
 | 
 | ||||||
|     return arbiter->ArbitrateAddress(static_cast<Kernel::ArbitrationType>(type), |     auto res = arbiter->ArbitrateAddress(static_cast<Kernel::ArbitrationType>(type), | ||||||
|                                          address, value, nanoseconds); |                                          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
 | /// 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); |     SharedPtr<Mutex> mutex = Mutex::Create(initial_locked != 0); | ||||||
|     CASCADE_RESULT(*out_handle, Kernel::g_handle_table.Create(std::move(mutex))); |     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", |     LOG_TRACE(Kernel_SVC, "called initial_locked=%s : created handle=0x%08X", | ||||||
|         initial_locked ? "true" : "false", *out_handle); |         initial_locked ? "true" : "false", *out_handle); | ||||||
|  |      | ||||||
|     return RESULT_SUCCESS; |     return RESULT_SUCCESS; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -402,6 +410,9 @@ static ResultCode ReleaseMutex(Handle handle) { | ||||||
|         return ERR_INVALID_HANDLE; |         return ERR_INVALID_HANDLE; | ||||||
| 
 | 
 | ||||||
|     mutex->Release(); |     mutex->Release(); | ||||||
|  | 
 | ||||||
|  |     HLE::Reschedule(__func__); | ||||||
|  | 
 | ||||||
|     return RESULT_SUCCESS; |     return RESULT_SUCCESS; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -440,6 +451,9 @@ static ResultCode ReleaseSemaphore(s32* count, Handle handle, s32 release_count) | ||||||
|         return ERR_INVALID_HANDLE; |         return ERR_INVALID_HANDLE; | ||||||
| 
 | 
 | ||||||
|     CASCADE_RESULT(*count, semaphore->Release(release_count)); |     CASCADE_RESULT(*count, semaphore->Release(release_count)); | ||||||
|  | 
 | ||||||
|  |     HLE::Reschedule(__func__); | ||||||
|  | 
 | ||||||
|     return RESULT_SUCCESS; |     return RESULT_SUCCESS; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -532,6 +546,9 @@ static ResultCode SetTimer(Handle handle, s64 initial, s64 interval) { | ||||||
|         return ERR_INVALID_HANDLE; |         return ERR_INVALID_HANDLE; | ||||||
| 
 | 
 | ||||||
|     timer->Set(initial, interval); |     timer->Set(initial, interval); | ||||||
|  | 
 | ||||||
|  |     HLE::Reschedule(__func__); | ||||||
|  | 
 | ||||||
|     return RESULT_SUCCESS; |     return RESULT_SUCCESS; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -546,6 +563,9 @@ static ResultCode CancelTimer(Handle handle) { | ||||||
|         return ERR_INVALID_HANDLE; |         return ERR_INVALID_HANDLE; | ||||||
| 
 | 
 | ||||||
|     timer->Cancel(); |     timer->Cancel(); | ||||||
|  | 
 | ||||||
|  |     HLE::Reschedule(__func__); | ||||||
|  | 
 | ||||||
|     return RESULT_SUCCESS; |     return RESULT_SUCCESS; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue