forked from eden-emu/eden
		
	kernel: process: Implement GetFreeThreadCount
Used by Just Dance® 2023 Edition
This commit is contained in:
		
							parent
							
								
									b8c03411e7
								
							
						
					
					
						commit
						dca4f0687a
					
				
					 3 changed files with 28 additions and 1 deletions
				
			
		|  | @ -285,6 +285,17 @@ void KProcess::UnregisterThread(KThread* thread) { | |||
|     thread_list.remove(thread); | ||||
| } | ||||
| 
 | ||||
| u64 KProcess::GetFreeThreadCount() const { | ||||
|     if (resource_limit != nullptr) { | ||||
|         const auto current_value = | ||||
|             resource_limit->GetCurrentValue(LimitableResource::ThreadCountMax); | ||||
|         const auto limit_value = resource_limit->GetLimitValue(LimitableResource::ThreadCountMax); | ||||
|         return limit_value - current_value; | ||||
|     } else { | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| Result KProcess::Reset() { | ||||
|     // Lock the process and the scheduler.
 | ||||
|     KScopedLightLock lk(state_lock); | ||||
|  |  | |||
|  | @ -304,6 +304,9 @@ public: | |||
|     /// from this process' thread list.
 | ||||
|     void UnregisterThread(KThread* thread); | ||||
| 
 | ||||
|     /// Retrieves the number of available threads for this process.
 | ||||
|     u64 GetFreeThreadCount() const; | ||||
| 
 | ||||
|     /// Clears the signaled state of the process if and only if it's signaled.
 | ||||
|     ///
 | ||||
|     /// @pre The process must not be already terminated. If this is called on a
 | ||||
|  |  | |||
|  | @ -815,8 +815,15 @@ static Result GetInfo(Core::System& system, u64* result, u64 info_id, Handle han | |||
|         // 6.0.0+
 | ||||
|         TotalPhysicalMemoryAvailableWithoutSystemResource = 21, | ||||
|         TotalPhysicalMemoryUsedWithoutSystemResource = 22, | ||||
|         // 10.0.0+
 | ||||
|         IsApplication = 23, | ||||
|         // 13.0.0+
 | ||||
|         FreeThreadCount = 24, | ||||
|         // 14.0.0+
 | ||||
|         IsSvcPermitted = 26, | ||||
| 
 | ||||
|         // Homebrew only
 | ||||
|         MesosphereMeta = 65000, | ||||
|         MesosphereCurrentProcess = 65001, | ||||
|     }; | ||||
| 
 | ||||
|  | @ -840,7 +847,9 @@ static Result GetInfo(Core::System& system, u64* result, u64 info_id, Handle han | |||
|     case GetInfoType::TitleId: | ||||
|     case GetInfoType::UserExceptionContextAddr: | ||||
|     case GetInfoType::TotalPhysicalMemoryAvailableWithoutSystemResource: | ||||
|     case GetInfoType::TotalPhysicalMemoryUsedWithoutSystemResource: { | ||||
|     case GetInfoType::TotalPhysicalMemoryUsedWithoutSystemResource: | ||||
|     case GetInfoType::IsApplication: | ||||
|     case GetInfoType::FreeThreadCount: { | ||||
|         if (info_sub_id != 0) { | ||||
|             LOG_ERROR(Kernel_SVC, "Info sub id is non zero! info_id={}, info_sub_id={}", info_id, | ||||
|                       info_sub_id); | ||||
|  | @ -929,6 +938,10 @@ static Result GetInfo(Core::System& system, u64* result, u64 info_id, Handle han | |||
|             *result = process->GetTotalPhysicalMemoryUsedWithoutSystemResource(); | ||||
|             return ResultSuccess; | ||||
| 
 | ||||
|         case GetInfoType::FreeThreadCount: | ||||
|             *result = process->GetFreeThreadCount(); | ||||
|             return ResultSuccess; | ||||
| 
 | ||||
|         default: | ||||
|             break; | ||||
|         } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Narr the Reg
						Narr the Reg