private KernelResult CreateThread( ulong entrypoint, ulong argsPtr, ulong stackTop, int priority, int cpuCore, out int handle) { handle = 0; KProcess currentProcess = _system.Scheduler.GetCurrentProcess(); if (cpuCore == -2) { cpuCore = currentProcess.DefaultCpuCore; } if ((uint)cpuCore >= KScheduler.CpuCoresCount || !currentProcess.IsCpuCoreAllowed(cpuCore)) { return(KernelResult.InvalidCpuCore); } if ((uint)priority >= KScheduler.PrioritiesCount || !currentProcess.IsPriorityAllowed(priority)) { return(KernelResult.InvalidPriority); } long timeout = KTimeManager.ConvertMillisecondsToNanoseconds(100); if (currentProcess.ResourceLimit != null && !currentProcess.ResourceLimit.Reserve(LimitableResource.Thread, 1, timeout)) { return(KernelResult.ResLimitExceeded); } KThread thread = new KThread(_system); KernelResult result = currentProcess.InitializeThread( thread, entrypoint, argsPtr, stackTop, priority, cpuCore); if (result == KernelResult.Success) { result = _process.HandleTable.GenerateHandle(thread, out handle); } else { currentProcess.ResourceLimit?.Release(LimitableResource.Thread, 1); } thread.DecrementReferenceCount(); return(result); }