summaryrefslogtreecommitdiff
path: root/src/JSystem/JKernel/JKRThread.cpp
diff options
context:
space:
mode:
authorJcw87 <Jcw87@users.noreply.github.com>2023-09-16 13:49:23 -0700
committerGitHub <noreply@github.com>2023-09-16 13:49:23 -0700
commite054193f0ad047bfa8df174a2dd6b1cc98bca6c7 (patch)
tree600ba006175da326e2f8211bb23f59b7e4137c9d /src/JSystem/JKernel/JKRThread.cpp
parent00fe8a08736de5d226952dbc60e440f346a4cb4f (diff)
JKRThread, JKRExpHeap, JKRFileLoader, JKRArchive (#42)
* JKRThread * JKRExpHeap * JKRFileLoader * JKRArchive
Diffstat (limited to 'src/JSystem/JKernel/JKRThread.cpp')
-rw-r--r--src/JSystem/JKernel/JKRThread.cpp131
1 files changed, 106 insertions, 25 deletions
diff --git a/src/JSystem/JKernel/JKRThread.cpp b/src/JSystem/JKernel/JKRThread.cpp
index cf539ab9..a8465bec 100644
--- a/src/JSystem/JKernel/JKRThread.cpp
+++ b/src/JSystem/JKernel/JKRThread.cpp
@@ -4,54 +4,135 @@
//
#include "JSystem/JKernel/JKRThread.h"
+#include "JSystem/JUtility/JUTAssert.h"
#include "dolphin/types.h"
+JSUList<JKRThread> JKRThread::sThreadList;
+JKRThreadSwitch* JKRThreadSwitch::sManager;
+OSThread* preEnd;
+JKRThreadSwitch_PreCallback JKRThreadSwitch::mUserPreCallback;
+JKRThreadSwitch_PostCallback JKRThreadSwitch::mUserPostCallback;
+
/* 802B3D1C-802B3E38 .text __ct__9JKRThreadFUlii */
-JKRThread::JKRThread(unsigned long, int, int) {
- /* Nonmatching */
+JKRThread::JKRThread(u32 stack_size, int message_count, int param_3) : mThreadListLink(this) {
+ mHeap = JKRHeap::findFromRoot(this);
+ if (mHeap == NULL) {
+ mHeap = JKRGetSystemHeap();
+ }
+
+ mStackSize = stack_size & 0xffffffe0;
+ mStackMemory = JKRAllocFromHeap(mHeap, mStackSize, 0x20);
+ mThreadRecord = (OSThread*)JKRAllocFromHeap(mHeap, sizeof(OSThread), 0x20);
+
+ void* stackBase = (void*)((int)mStackMemory + mStackSize);
+ OSCreateThread(mThreadRecord, start, this, stackBase, mStackSize, param_3, 1);
+
+ mMessageCount = message_count;
+ mMessages = (OSMessage*)JKRAllocFromHeap(mHeap, mMessageCount * sizeof(OSMessage), 0);
+
+ OSInitMessageQueue(&mMessageQueue, mMessages, mMessageCount);
+ getList().append(&mThreadListLink);
+
+ mCurrentHeap = NULL;
+ mCurrentHeapError = NULL;
}
/* 802B3E38-802B3EFC .text __ct__9JKRThreadFP8OSThreadi */
-JKRThread::JKRThread(OSThread*, int) {
- /* Nonmatching */
+JKRThread::JKRThread(OSThread* thread, int message_count) : mThreadListLink(this) {
+ mHeap = NULL;
+ mThreadRecord = thread;
+ mStackSize = (u32)thread->stack_end - (u32)thread->stack_base;
+ mStackMemory = thread->stack_base;
+
+ mMessageCount = message_count;
+ mMessages = (OSMessage*)JKRGetSystemHeap()->alloc(mMessageCount * sizeof(OSMessage), 4);
+
+ OSInitMessageQueue(&mMessageQueue, mMessages, mMessageCount);
+ getList().append(&mThreadListLink);
+
+ mCurrentHeap = NULL;
+ mCurrentHeapError = NULL;
}
/* 802B3EFC-802B3FD4 .text __dt__9JKRThreadFv */
JKRThread::~JKRThread() {
- /* Nonmatching */
+ getList().remove(&mThreadListLink);
+
+ if (mHeap) {
+ BOOL result = OSIsThreadTerminated(mThreadRecord);
+ if (result == FALSE) {
+ OSDetachThread(mThreadRecord);
+ OSCancelThread(mThreadRecord);
+ }
+ JKRFreeToHeap(mHeap, mStackMemory);
+ JKRFreeToHeap(mHeap, mThreadRecord);
+ }
+ i_JKRFree(mMessages);
}
/* 802B3FD4-802B4000 .text start__9JKRThreadFPv */
-void JKRThread::start(void*) {
- /* Nonmatching */
+void* JKRThread::start(void* param) {
+ JKRThread* thread = (JKRThread*)param;
+ return thread->run();
}
/* 802B4000-802B4050 .text __ct__15JKRThreadSwitchFP7JKRHeap */
-JKRThreadSwitch::JKRThreadSwitch(JKRHeap*) {
- /* Nonmatching */
+JKRThreadSwitch::JKRThreadSwitch(JKRHeap* param_0) {
+ mHeap = param_0;
+ OSSetSwitchThreadCallback(JKRThreadSwitch::callback);
+ mSetNextHeap = true;
}
/* 802B4050-802B40EC .text createManager__15JKRThreadSwitchFP7JKRHeap */
-void JKRThreadSwitch::createManager(JKRHeap*) {
- /* Nonmatching */
+JKRThreadSwitch* JKRThreadSwitch::createManager(JKRHeap* heap) {
+ JUT_ASSERT(184, sManager == 0);
+
+ if (!heap) {
+ heap = JKRGetCurrentHeap();
+ }
+
+ sManager = new (heap, 0) JKRThreadSwitch(heap);
+ return sManager;
}
/* 802B40EC-802B41DC .text callback__15JKRThreadSwitchFP8OSThreadP8OSThread */
-void JKRThreadSwitch::callback(OSThread*, OSThread*) {
- /* Nonmatching */
-}
+void JKRThreadSwitch::callback(OSThread* current, OSThread* next) {
+ if (mUserPreCallback) {
+ (*mUserPreCallback)(current, next);
+ }
-/* 802B41DC-802B41E4 .text run__9JKRThreadFv */
-void JKRThread::run() {
- /* Nonmatching */
-}
+ if (!current && !next) {
+ preEnd = current;
+ current = NULL;
+ }
-/* 802B41E4-802B422C .text __dt__15JKRThreadSwitchFv */
-JKRThreadSwitch::~JKRThreadSwitch() {
- /* Nonmatching */
-}
+ if (!current && !next) {
+ current = preEnd;
+ preEnd = NULL;
+ }
-/* 802B4270-802B42C4 .text __dt__19JSUList<9JKRThread>Fv */
-JSUList<JKRThread>::~JSUList() {
- /* Nonmatching */
+ JSUList<JKRThread>& threadList = JKRThread::getList();
+ JSUListIterator<JKRThread> iterator;
+ for (iterator = threadList.getFirst(); iterator != threadList.getEnd(); ++iterator) {
+ JKRThread* thread = iterator.getObject();
+
+ if (thread->getThreadRecord() == current) {
+ thread->setCurrentHeap(JKRHeap::getCurrentHeap());
+ }
+
+ if (thread->getThreadRecord() == next) {
+ if (sManager->mSetNextHeap) {
+ thread->getCurrentHeap()->becomeCurrentHeap();
+ }
+ }
+ }
+
+ if (mUserPostCallback) {
+ (*mUserPostCallback)(current, next);
+ }
}
+
+static void dummy() {
+ OSReport("Cannot create JKRTask Manager.");
+ OSReport("sManager != 0");
+} \ No newline at end of file