diff options
| author | Luke Street <luke@street.dev> | 2026-03-01 15:35:36 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-01 14:35:36 -0800 |
| commit | 9649319ec4926457ef85e6094f8207474c977c2d (patch) | |
| tree | 1c5cd4c7cc4c1aee03f28921213da47f2775444d /src/JSystem/JKernel/JKRThread.cpp | |
| parent | 6e149819e13b1f70ecbf8a4c66b030c17ffed2bb (diff) | |
Reorganize library code into `libs/` (#3119)
* Reorganize files into libs/{dolphin,JSystem,PowerPC_EABI_Support,revolution,TRK_MINNOW_DOLPHIN}
* Update configure.py and project.py for new libs structure
* Refactor `#include <dolphin/x.h>` -> `<x.h>`
* Remove `__REVOLUTION_SDK__` forwards from dolphin
* Fix dolphin/ references in revolution
* Wrap `#include <dolphin.h>` in `!__REVOLUTION_SDK__`
* Always build TRK against dolphin headers
* Resolve revolution SDK header resolution issues
Diffstat (limited to 'src/JSystem/JKernel/JKRThread.cpp')
| -rw-r--r-- | src/JSystem/JKernel/JKRThread.cpp | 338 |
1 files changed, 0 insertions, 338 deletions
diff --git a/src/JSystem/JKernel/JKRThread.cpp b/src/JSystem/JKernel/JKRThread.cpp deleted file mode 100644 index cb5055012a..0000000000 --- a/src/JSystem/JKernel/JKRThread.cpp +++ /dev/null @@ -1,338 +0,0 @@ -#include "JSystem/JSystem.h" // IWYU pragma: keep - -#include "JSystem/JKernel/JKRThread.h" -#include "JSystem/JUtility/JUTAssert.h" -#include "JSystem/JUtility/JUTConsole.h" -#include <cstdio> -#include "global.h" -#include <stdint.h> - -JSUList<JKRThread> JKRThread::sThreadList(0); - -void* JKRIdleThread::sThread; - -JKRThreadSwitch* JKRThreadSwitch::sManager; - -u32 JKRThreadSwitch::sTotalCount; - -u64 JKRThreadSwitch::sTotalStart; - -JKRThreadSwitch_PreCallback JKRThreadSwitch::mUserPreCallback; - -JKRThreadSwitch_PostCallback JKRThreadSwitch::mUserPostCallback; - -JKRThread::JKRThread(u32 stack_size, int message_count, int param_3) : mThreadListLink(this) { - JKRHeap* heap = JKRHeap::findFromRoot(this); - if (heap == NULL) { - heap = JKRGetSystemHeap(); - } - - setCommon_heapSpecified(heap, stack_size, param_3); - setCommon_mesgQueue(mHeap, message_count); -} - -JKRThread::JKRThread(JKRHeap* heap, u32 stack_size, int message_count, int param_4) - : mThreadListLink(this) { - if (heap == NULL) { - heap = JKRGetCurrentHeap(); - } - - setCommon_heapSpecified(heap, stack_size, param_4); - setCommon_mesgQueue(mHeap, message_count); -} - -JKRThread::JKRThread(OSThread* thread, int message_count) : mThreadListLink(this) { - mHeap = NULL; - mThreadRecord = thread; - mStackSize = (uintptr_t)thread->stackEnd - (uintptr_t)thread->stackBase; - mStackMemory = thread->stackBase; - - setCommon_mesgQueue(JKRGetSystemHeap(), message_count); -} - -JKRThread::~JKRThread() { - sThreadList.remove(&mThreadListLink); - - if (mHeap) { - if (OSIsThreadTerminated(mThreadRecord) == FALSE) { - OSDetachThread(mThreadRecord); - OSCancelThread(mThreadRecord); - } - JKRFreeToHeap(mHeap, mStackMemory); - JKRFreeToHeap(mHeap, mThreadRecord); - } - JKRFree(mMesgBuffer); -} - -void JKRThread::setCommon_mesgQueue(JKRHeap* heap, int message_count) { - mMessageCount = message_count; - mMesgBuffer = (OSMessage*)JKRAllocFromHeap(heap, mMessageCount * sizeof(OSMessage), 0); - JUT_ASSERT(130, mMesgBuffer); - - OSInitMessageQueue(&mMessageQueue, mMesgBuffer, mMessageCount); - sThreadList.append(&mThreadListLink); - - mCurrentHeap = NULL; - mCurrentHeapError = 0; -} - -void JKRThread::setCommon_heapSpecified(JKRHeap* heap, u32 stack_size, int param_3) { - mHeap = heap; - mStackSize = stack_size & 0xffffffe0; - mStackMemory = JKRAllocFromHeap(mHeap, mStackSize, 0x20); - JUT_ASSERT(164, mStackMemory); - mThreadRecord = (OSThread*)JKRAllocFromHeap(mHeap, sizeof(OSThread), 0x20); - JUT_ASSERT(168, mThreadRecord); - - OSCreateThread(mThreadRecord, start, this, (u8*)mStackMemory + mStackSize, mStackSize, param_3, 1); -} - -void* JKRThread::start(void* thread) { - return ((JKRThread*)thread)->run(); -} - -JKRThread* JKRThread::searchThread(OSThread* thread) { - for (JSUListIterator<JKRThread> iterator = getList().getFirst(); iterator != getList().getEnd(); ++iterator) { - if (iterator->getThreadRecord() == thread) { - return iterator.getObject(); - } - } - - return NULL; -} - -static void dummy1(JKRThread* thread, JKRThread::TLoad* load) { - load->getId(); - load->isValid(); - thread->getLoadInfo(); -} - -JKRThreadSwitch::JKRThreadSwitch(JKRHeap* param_0) { - mHeap = param_0; - OSSetSwitchThreadCallback(JKRThreadSwitch::callback); - this->field_0xC = 0; - this->field_0x10 = 1; - this->field_0x18 = 0; - sTotalCount = 0; - sTotalStart = 0; - this->field_0x20 = 0; - this->field_0x24 = 0; - mSetNextHeap = true; -} - -JKRThreadSwitch* JKRThreadSwitch::createManager(JKRHeap* heap) { - JUT_ASSERT(343, sManager == NULL); - - if (!heap) { - heap = JKRGetCurrentHeap(); - } - - sManager = new (heap, 0) JKRThreadSwitch(heap); - return sManager; -} - -static void dummy2(JKRThread::TLoad* load) { - load->setValid(false); - load->setId(0); -} - -JKRThread* JKRThreadSwitch::enter(JKRThread* thread, int thread_id) { - if (!thread) { - return NULL; - } - - JKRThread* found_thread = JKRThread::searchThread(thread->getThreadRecord()); - if (found_thread) { - thread = found_thread; - } - - JKRThread::TLoad* loadInfo = thread->getLoadInfo(); - loadInfo->clear(); - loadInfo->setValid(true); - loadInfo->setId(thread_id); - return thread; -} - -static void dummyStrings() { - DEAD_STRING("on"); - DEAD_STRING("off"); - DEAD_STRING("JKRThread:%x OSThread:%x Load:ID:%d (%s)\n"); -} - -void JKRThreadSwitch::callback(OSThread* current, OSThread* next) { - if (mUserPreCallback) { - (*mUserPreCallback)(current, next); - } - - sTotalCount = sTotalCount + 1; - - JKRHeap* next_heap = NULL; - for (JSUListIterator<JKRThread> iterator = JKRThread::getList().getFirst(); iterator != JKRThread::getList().getEnd(); ++iterator) { - JKRThread* thread = iterator.getObject(); - - if (thread->getThreadRecord() == current) { - thread->setCurrentHeap(JKRHeap::getCurrentHeap()); - if (thread->getLoadInfo()->isValid()) { - thread->getLoadInfo()->addCurrentCost(); - } - } - - if (thread->getThreadRecord() == next) { - if (thread->getLoadInfo()->isValid()) { - thread->getLoadInfo()->setCurrentTime(); - thread->getLoadInfo()->incCount(); - } - - if (sManager->mSetNextHeap) { - next_heap = thread->getCurrentHeap(); - if (!next_heap) { - next_heap = JKRHeap::getCurrentHeap(); - } else if (JKRHeap::getRootHeap()->isSubHeap(next_heap)) { - continue; - #if PLATFORM_WII || PLATFORM_SHIELD - } else if (JKRHeap::getRootHeap2()->isSubHeap(next_heap)) { - continue; - #endif - } else { - switch (thread->getCurrentHeapError()) { - case 0: - JUT_PANIC(508, "JKRThreadSwitch: currentHeap destroyed."); - break; - case 1: - JUTWarningConsole("JKRThreadSwitch: currentHeap destroyed.\n"); - next_heap = JKRHeap::getCurrentHeap(); - break; - case 2: - next_heap = JKRHeap::getCurrentHeap(); - break; - case 3: - next_heap = JKRHeap::getSystemHeap(); - break; - } - } - } - } - } - - if (next_heap) { - next_heap->becomeCurrentHeap(); - } - - if (mUserPostCallback) { - (*mUserPostCallback)(current, next); - } -} - -void dummy3(JKRThreadSwitch* threadSw, JKRThreadName_* name) { - threadSw->draw(name); -} - -void JKRThreadSwitch::draw(JKRThreadName_* thread_name_list, JUTConsole* console) { - const char* print_0 = " total: switch:%3d time:%d(%df)\n"; - const char* print_1 = " -------------------------------------\n"; - - if (console) { - console->clear(); - console->print_f(print_0, getTotalCount(), (int)this->field_0x18, this->field_0x10); - console->print(print_1); - } else { - OS_REPORT(print_0, getTotalCount(), (int)this->field_0x18, this->field_0x10); - OS_REPORT(print_1); - } - - for (JSUListIterator<JKRThread> iterator = JKRThread::getList().getFirst(); iterator != JKRThread::getList().getEnd(); ++iterator) { - JKRThread* thread = iterator.getObject(); - JKRThread::TLoad* loadInfo = thread->getLoadInfo(); - - if (loadInfo->isValid()) { - char* thread_print_name = NULL; - if (thread_name_list) { - JKRThreadName_* thread_name = thread_name_list; - for (; thread_name->name; thread_name++) { - if (thread_name->id == loadInfo->getId()) { - thread_print_name = thread_name->name; - break; - } - } - } - - if (!thread_print_name) { - char buffer[16]; - sprintf(buffer, "%d", loadInfo->getId()); - thread_print_name = buffer; - } - - u32 switch_count = loadInfo->getCount(); - u32 cost = loadInfo->getCost(); - f32 cost_per_0x18 = loadInfo->getCost() / f32(this->field_0x18); - - u32 cost_int = (u32)(cost_per_0x18 * 100.0f); - u32 cost_float = (u32)(cost_per_0x18 * 1000.0f) % 10; - if (console) { - console->print_f(" [%10s] switch:%5d cost:%2d.%d%%\n", thread_print_name, - switch_count, cost_int, cost_float); - } else { - OS_REPORT(" [%10s] switch:%5d cost:%2d.%d%%\n", thread_print_name, switch_count, - cost_int, cost_float); - - } - } - } -} - -static void dummy4(JKRTask* thread, JSULink<JKRTask>* link) { - thread->getStack(); - delete link; -} - -JKRTask::~JKRTask() { - sTaskList.remove(&mTaskLink); -} - -void* JKRTask::run() { - struct TaskMessage { - void (*field_0x0)(int); - int field_0x4; - void* field_0x8; - }; - OSInitFastCast(); - while (true) { - TaskMessage* msg = (TaskMessage*)waitMessageBlock(); - if (msg->field_0x0) { - msg->field_0x0(msg->field_0x4); - check(); - if (field_0x94) { - OSSendMessage(field_0x94, msg->field_0x8, OS_MESSAGE_NOBLOCK); - } - } - msg->field_0x0 = NULL; - } -} - -int JKRTask::check() { - int result = 0; - u8* ptr = (u8*)JKRThread::getStack(); - JUT_ASSERT(1033, *((u32*)ptr) == 0xDEADBABE); - ptr += 4; - result += 4; - while (*ptr++ == 0xDE) { result++; } - return result; -} - -#if !PLATFORM_GCN -static void dummy(JKRIdleThread* thread) { - thread->run(); - delete thread; - thread->destroy(); -} -#endif - -#pragma push -#pragma force_active on -JSUList<JKRTask> JKRTask::sTaskList; -#pragma pop - -#pragma push -#pragma force_active on -u8 JKRTask::sEndMesgQueue[32]; -#pragma pop |
