|
|
|
@ -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)
|
|
|
|
|