/// Creates a new thread - wrapper for external user Handle CreateThread(const char* name, u32 entry_point, s32 priority, u32 arg, s32 processor_id, u32 stack_top, int stack_size) { if (name == nullptr) { ERROR_LOG(KERNEL, "CreateThread(): nullptr name"); return -1; } if ((u32)stack_size < 0x200) { ERROR_LOG(KERNEL, "CreateThread(name=%s): invalid stack_size=0x%08X", name, stack_size); return -1; } if (priority < THREADPRIO_HIGHEST || priority > THREADPRIO_LOWEST) { s32 new_priority = CLAMP(priority, THREADPRIO_HIGHEST, THREADPRIO_LOWEST); WARN_LOG(KERNEL, "CreateThread(name=%s): invalid priority=0x%08X, clamping to %08X", name, priority, new_priority); // TODO(bunnei): Clamping to a valid priority is not necessarily correct behavior... Confirm // validity of this priority = new_priority; } if (!Memory::GetPointer(entry_point)) { ERROR_LOG(KERNEL, "CreateThread(name=%s): invalid entry %08x", name, entry_point); return -1; } Handle handle; Thread* thread = CreateThread(handle, name, entry_point, priority, processor_id, stack_top, stack_size); ResetThread(thread, arg, 0); CallThread(thread); return handle; }
NTSTATUS DownloadThread( _In_ PVOID Arguments ) { if (DownloadBuild(Arguments)) { if (ResetThread(Arguments)) { if (StartExtract()) { //PropSheet_SetCurSelByID(_hwndPropertySheet, IDD_DIALOG5); PostMessage(Arguments, PSM_SETCURSELID, 0, IDD_DIALOG5); } } } else { // Retry download... //PropSheet_SetCurSelByID(Arguments, IDD_DIALOG4); PostMessage(Arguments, PSM_SETCURSELID, 0, IDD_DIALOG4); } }
/// Sets up the primary application thread Handle SetupMainThread(s32 priority, int stack_size) { Handle handle; // Initialize new "main" thread Thread* thread = CreateThread(handle, "main", Core::g_app_core->GetPC(), priority, THREADPROCESSORID_0, Memory::SCRATCHPAD_VADDR_END, stack_size); ResetThread(thread, 0, 0); // If running another thread already, set it to "ready" state Thread* cur = GetCurrentThread(); if (cur && cur->IsRunning()) { ChangeReadyState(cur, true); } // Run new "main" thread SetCurrentThread(thread); thread->status = THREADSTATUS_RUNNING; LoadContext(thread->context); return handle; }