mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-23 06:34:18 -04:00
191 lines
4.8 KiB
C++
191 lines
4.8 KiB
C++
#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<JKRThread>* 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<JKRThread> sThreadList;
|
|
|
|
protected:
|
|
JSULink<JKRThread> 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<JKRTask> 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<JKRTask> 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
|