kernel: process: Implement GetFreeThreadCount

Used by Just Dance® 2023 Edition
master
Narr the Reg 2022-12-15 13:22:07 +07:00
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); 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() { Result KProcess::Reset() {
// Lock the process and the scheduler. // Lock the process and the scheduler.
KScopedLightLock lk(state_lock); KScopedLightLock lk(state_lock);

@ -304,6 +304,9 @@ public:
/// from this process' thread list. /// from this process' thread list.
void UnregisterThread(KThread* thread); 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. /// 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 /// @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+ // 6.0.0+
TotalPhysicalMemoryAvailableWithoutSystemResource = 21, TotalPhysicalMemoryAvailableWithoutSystemResource = 21,
TotalPhysicalMemoryUsedWithoutSystemResource = 22, TotalPhysicalMemoryUsedWithoutSystemResource = 22,
// 10.0.0+
IsApplication = 23,
// 13.0.0+
FreeThreadCount = 24,
// 14.0.0+
IsSvcPermitted = 26,
// Homebrew only // Homebrew only
MesosphereMeta = 65000,
MesosphereCurrentProcess = 65001, MesosphereCurrentProcess = 65001,
}; };
@ -840,7 +847,9 @@ static Result GetInfo(Core::System& system, u64* result, u64 info_id, Handle han
case GetInfoType::TitleId: case GetInfoType::TitleId:
case GetInfoType::UserExceptionContextAddr: case GetInfoType::UserExceptionContextAddr:
case GetInfoType::TotalPhysicalMemoryAvailableWithoutSystemResource: case GetInfoType::TotalPhysicalMemoryAvailableWithoutSystemResource:
case GetInfoType::TotalPhysicalMemoryUsedWithoutSystemResource: { case GetInfoType::TotalPhysicalMemoryUsedWithoutSystemResource:
case GetInfoType::IsApplication:
case GetInfoType::FreeThreadCount: {
if (info_sub_id != 0) { if (info_sub_id != 0) {
LOG_ERROR(Kernel_SVC, "Info sub id is non zero! info_id={}, info_sub_id={}", info_id, LOG_ERROR(Kernel_SVC, "Info sub id is non zero! info_id={}, info_sub_id={}", info_id,
info_sub_id); info_sub_id);
@ -929,6 +938,10 @@ static Result GetInfo(Core::System& system, u64* result, u64 info_id, Handle han
*result = process->GetTotalPhysicalMemoryUsedWithoutSystemResource(); *result = process->GetTotalPhysicalMemoryUsedWithoutSystemResource();
return ResultSuccess; return ResultSuccess;
case GetInfoType::FreeThreadCount:
*result = process->GetFreeThreadCount();
return ResultSuccess;
default: default:
break; break;
} }