|
@@ -11,6 +11,7 @@
|
|
|
#include "common/thread_queue_list.h"
|
|
#include "common/thread_queue_list.h"
|
|
|
|
|
|
|
|
#include "core/core.h"
|
|
#include "core/core.h"
|
|
|
|
|
+#include "core/core_timing.h"
|
|
|
#include "core/hle/hle.h"
|
|
#include "core/hle/hle.h"
|
|
|
#include "core/hle/kernel/kernel.h"
|
|
#include "core/hle/kernel/kernel.h"
|
|
|
#include "core/hle/kernel/thread.h"
|
|
#include "core/hle/kernel/thread.h"
|
|
@@ -34,6 +35,7 @@ public:
|
|
|
inline bool IsReady() const { return (status & THREADSTATUS_READY) != 0; }
|
|
inline bool IsReady() const { return (status & THREADSTATUS_READY) != 0; }
|
|
|
inline bool IsWaiting() const { return (status & THREADSTATUS_WAIT) != 0; }
|
|
inline bool IsWaiting() const { return (status & THREADSTATUS_WAIT) != 0; }
|
|
|
inline bool IsSuspended() const { return (status & THREADSTATUS_SUSPEND) != 0; }
|
|
inline bool IsSuspended() const { return (status & THREADSTATUS_SUSPEND) != 0; }
|
|
|
|
|
+ inline bool IsIdle() const { return idle; }
|
|
|
|
|
|
|
|
ResultVal<bool> WaitSynchronization() override {
|
|
ResultVal<bool> WaitSynchronization() override {
|
|
|
const bool wait = status != THREADSTATUS_DORMANT;
|
|
const bool wait = status != THREADSTATUS_DORMANT;
|
|
@@ -69,6 +71,9 @@ public:
|
|
|
std::vector<Handle> waiting_threads;
|
|
std::vector<Handle> waiting_threads;
|
|
|
|
|
|
|
|
std::string name;
|
|
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.
|
|
// Lists all thread ids that aren't deleted/etc.
|
|
@@ -444,7 +449,14 @@ ResultCode SetThreadPriority(Handle handle, s32 priority) {
|
|
|
return RESULT_SUCCESS;
|
|
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 SetupMainThread(s32 priority, int stack_size) {
|
|
|
Handle handle;
|
|
Handle handle;
|
|
|
|
|
|
|
@@ -497,6 +509,15 @@ void Reschedule() {
|
|
|
ResumeThreadFromWait(prev->GetHandle());
|
|
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) {
|
|
ResultCode GetThreadId(u32* thread_id, Handle handle) {
|
|
|
Thread* thread = g_handle_table.Get<Thread>(handle);
|
|
Thread* thread = g_handle_table.Get<Thread>(handle);
|
|
|
if (thread == nullptr)
|
|
if (thread == nullptr)
|