예제 #1
0
파일: thread.cpp 프로젝트: Aurorer/citra
/// 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;
}
예제 #2
0
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);
    }
}
예제 #3
0
파일: thread.cpp 프로젝트: Aurorer/citra
/// 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;
}