|
|
|
@ -11,6 +11,7 @@ |
|
|
|
#include "common/thread_queue_list.h"
|
|
|
|
|
|
|
|
#include "core/core.h"
|
|
|
|
#include "core/core_timing.h"
|
|
|
|
#include "core/hle/hle.h"
|
|
|
|
#include "core/hle/kernel/kernel.h"
|
|
|
|
#include "core/hle/kernel/thread.h"
|
|
|
|
@ -34,6 +35,7 @@ public: |
|
|
|
inline bool IsReady() const { return (status & THREADSTATUS_READY) != 0; } |
|
|
|
inline bool IsWaiting() const { return (status & THREADSTATUS_WAIT) != 0; } |
|
|
|
inline bool IsSuspended() const { return (status & THREADSTATUS_SUSPEND) != 0; } |
|
|
|
inline bool IsIdle() const { return idle; } |
|
|
|
|
|
|
|
ResultVal<bool> WaitSynchronization() override { |
|
|
|
const bool wait = status != THREADSTATUS_DORMANT; |
|
|
|
@ -69,6 +71,9 @@ public: |
|
|
|
std::vector<Handle> waiting_threads; |
|
|
|
|
|
|
|
std::string name; |
|
|
|
|
|
|
|
/// Whether this thread is intended to never actually be executed, i.e. always idle
|
|
|
|
bool idle = false; |
|
|
|
}; |
|
|
|
|
|
|
|
// Lists all thread ids that aren't deleted/etc.
|
|
|
|
@ -444,7 +449,14 @@ ResultCode SetThreadPriority(Handle handle, s32 priority) { |
|
|
|
return RESULT_SUCCESS; |
|
|
|
} |
|
|
|
|
|
|
|
/// Sets up the primary application thread
|
|
|
|
Handle SetupIdleThread() { |
|
|
|
Handle handle; |
|
|
|
Thread* thread = CreateThread(handle, "idle", 0, THREADPRIO_LOWEST, THREADPROCESSORID_0, 0, 0); |
|
|
|
thread->idle = true; |
|
|
|
CallThread(thread); |
|
|
|
return handle; |
|
|
|
} |
|
|
|
|
|
|
|
Handle SetupMainThread(s32 priority, int stack_size) { |
|
|
|
Handle handle; |
|
|
|
|
|
|
|
@ -497,6 +509,15 @@ void Reschedule() { |
|
|
|
ResumeThreadFromWait(prev->GetHandle()); |
|
|
|
} |
|
|
|
|
|
|
|
bool IsIdleThread(Handle handle) { |
|
|
|
Thread* thread = g_handle_table.Get<Thread>(handle); |
|
|
|
if (!thread) { |
|
|
|
LOG_ERROR(Kernel, "Thread not found %u", handle); |
|
|
|
return false; |
|
|
|
} |
|
|
|
return thread->IsIdle(); |
|
|
|
} |
|
|
|
|
|
|
|
ResultCode GetThreadId(u32* thread_id, Handle handle) { |
|
|
|
Thread* thread = g_handle_table.Get<Thread>(handle); |
|
|
|
if (thread == nullptr) |
|
|
|
|