#ifndef JKRTHREAD_H #define JKRTHREAD_H #include "types.h" #include "dolphin/os/OSMessage.h" #include "dolphin/os/OSThread.h" #include "dolphin/os/OSTime.h" #include "JSystem/JSupport/JSUList.h" #include "JSystem/JKernel/JKRHeap.h" #include "JSystem/JKernel/JKRDisposer.h" #include "JSystem/JUtility/JUTConsole.h" #ifdef __cplusplus struct JKRThread; // class JUTConsole; struct JKRThreadName_ { s32 id; char* name; }; typedef void (*JKRThreadSwitch_PreCallback)(OSThread* current, OSThread* next); typedef void (*JKRThreadSwitch_PostCallback)(OSThread* current, OSThread* next); class JKRThreadSwitch { public: JKRThreadSwitch(JKRHeap*); virtual void draw(JKRThreadName_* param_1, JUTConsole* param_2); virtual void draw(JKRThreadName_* param_1); virtual ~JKRThreadSwitch(); static JKRThreadSwitch* createManager(JKRHeap* heap); JKRThread* enter(JKRThread* param_1, int param_2); static void callback(OSThread* param_1, OSThread* param_2); static u32 getTotalCount() { return sTotalCount; } private: static JKRThreadSwitch* sManager; static u32 sTotalCount; static u64 sTotalStart; static JKRThreadSwitch_PreCallback mUserPreCallback; static JKRThreadSwitch_PostCallback mUserPostCallback; private: JKRHeap* mHeap; // _04 bool mSetNextHeap; // _08 u8 _09[3]; // _09, padding? u32 _0C; // _0C u32 _10; // _10 u8 _14[4]; // _14 - unknown/padding s64 _18; // _18 JUTConsole* mConsole; // _20 JKRThreadName_* mThreadName; // _24 }; class JKRThread : public JKRDisposer { public: JKRThread(u32 stackSize, int msgCount, int threadPrio); JKRThread(OSThread* osThread, int msgCount); virtual ~JKRThread(); virtual void* run() { return nullptr; } static void* start(void* param); static JSUList* getList() { return &JKRThread::sThreadList; } OSThread* getThreadRecord() const { return this->mThreadRecord; } void* getStack() const { return this->mStackMemory; } void resume() { OSResumeThread(this->mThreadRecord); } void jamMessageBlock(OSMessage msg) { OSJamMessage(&this->mMesgQueue, msg, OS_MESSAGE_BLOCK); } void sendMessage(OSMessage msg) { OSSendMessage(&this->mMesgQueue, msg, OS_MESSAGE_NOBLOCK); } OSMessage waitMessage(int* received) { OSMessage mesg; BOOL retrieved = OSReceiveMessage(&this->mMesgQueue, &mesg, OS_MESSAGE_NOBLOCK); if (received != nullptr) { *received = retrieved; } return mesg; } OSMessage waitMeessageBlock() { OSMessage mesg; OSReceiveMessage(&this->mMesgQueue, &mesg, OS_MESSAGE_BLOCK); return mesg; } static JSUList sThreadList; protected: JSULink mLink; JKRHeap* mHeap; OSThread* mThreadRecord; OSMessageQueue mMesgQueue; OSMessage* mMesgBuffer; int mMesgCount; void* mStackMemory; u32 mStackSize; }; // Unused class, function definitions from Sunshine and MKDD class JKRTask : public JKRThread { typedef void (*RequestCallback)(void*); /** * @fabricated * @size{0xC} */ struct Request { RequestCallback mCb; void* mArg; void* mMsg; }; JKRTask(); // unused/inlined virtual ~JKRTask(); // _08 virtual void* run(); // _0C bool request(RequestCallback, void*, void*); static JKRTask* create(); // unused/inlined: Request* searchBlank(); void requestJam(RequestCallback, void*, void*); void cancelAll(); void createTaskEndMessageQueue(int, JKRHeap*); void destroyTaskEndMessageQueue(); void waitQueueMessageBlock(OSMessageQueue*, int*); void waitQueueMessage(OSMessageQueue*, int*); OSMessage waitMessageBlock() { OSMessage msg; OSReceiveMessage(&mMesgQueue, &msg, OS_MESSAGE_BLOCK); return msg; } void destroy(); // Unused static OSMessage* sEndMesgBuffer; static u32 sEndMesgBufSize; // u32 _78; // _78 // JSULink mTaskLink; // _7C, this didn't exist yet Request* mRequest; // _8C - ptr to request array u32 mRequestCnt; // _90 - amount of requests OSMessageQueue* mTaskMsgQueue; // _94 static JSUList sTaskList; static u8 sEndMesgQueue[32]; // Unused }; /** @unused */ struct JKRIdleThread : public JKRThread { virtual ~JKRIdleThread() {}; // _08 virtual void* run() // _0C { while (true) {} }; virtual void destroy() { } // 0x10 static void create(JKRHeap*, int, u32); static JKRIdleThread* sThread; }; #endif #endif