From 2de366be0fa75e571c605e017b5604bccbdb75bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Fri, 5 Jun 2020 17:09:06 +0200 Subject: Initial commit --- src/KingSystem/ActorSystem/actBaseProcMgr.cpp | 133 ++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 src/KingSystem/ActorSystem/actBaseProcMgr.cpp (limited to 'src/KingSystem/ActorSystem/actBaseProcMgr.cpp') diff --git a/src/KingSystem/ActorSystem/actBaseProcMgr.cpp b/src/KingSystem/ActorSystem/actBaseProcMgr.cpp new file mode 100644 index 00000000..81ebe6a2 --- /dev/null +++ b/src/KingSystem/ActorSystem/actBaseProcMgr.cpp @@ -0,0 +1,133 @@ +#include "KingSystem/ActorSystem/actBaseProcMgr.h" +#include +#include + +namespace ksys::act { + +SEAD_SINGLETON_DISPOSER_IMPL(BaseProcMgr) + +void BaseProcMgr::generateProcId(u32* id) { + *id = mCreatedProcCounter.increment(); +} + +void BaseProcMgr::registerProc(BaseProc& proc) { + auto lock = sead::makeScopedLock(mProcMapCS); + proc.mMapNode.key().setKey(proc.mName); + mProcMap.insert(&proc.mMapNode); +} + +void BaseProcMgr::unregisterProc(BaseProc& proc) { + if (!proc.mMapNode.isInserted()) + return; + + auto lock = sead::makeScopedLock(mProcMapCS); + mProcMap.erase(&proc.mMapNode); +} + +void BaseProcMgr::addToPreDeleteList(BaseProc& proc) { + auto lock = sead::makeScopedLock(mProcPreDeleteListCS); + mProcPreDeleteList.pushBack(&proc); +} + +void BaseProcMgr::doAddToUpdateStateList_(BaseProc& proc) { + if (mProcUpdateStateList.isNodeLinked(&proc)) + return; + + if (proc.mCreatePriorityState == 1) { + proc.mCreatePriorityState = 0; + mProcUpdateStateList.pushFront(&proc); + } else { + mProcUpdateStateList.pushBack(&proc); + } +} + +void BaseProcMgr::eraseFromPreDeleteList(BaseProc& proc) { + auto lock = sead::makeScopedLock(mProcPreDeleteListCS); + if (mProcPreDeleteList.isNodeLinked(&proc)) + mProcPreDeleteList.erase(&proc); +} + +void BaseProcMgr::eraseFromUpdateStateList(BaseProc& proc) { + auto lock = sead::makeScopedLock(mProcUpdateStateListCS); + if (mProcUpdateStateList.isNodeLinked(&proc)) + mProcUpdateStateList.erase(&proc); +} + +void BaseProcMgr::processPreDeleteList() { + mStatus = Status::ProcessingPreDeleteList; + + auto lock = sead::makeScopedLock(mProcPreDeleteListCS); + for (auto& proc : mProcPreDeleteList.robustRange()) + proc.processPreDelete(); + + mStatus = Status::Idle; +} + +bool BaseProcMgr::hasExtraJobLink(BaseProcJobLink* job_link, s32 idx) { + for (auto& ptr : mExtraJobLinkArrays[idx]) { + if (&ptr == job_link) + return true; + } + return false; +} + +void BaseProcMgr::clearExtraJobArrays() { + mExtraJobLinkArrays[0].clear(); + mExtraJobLinkArrays[1].clear(); +} + +void BaseProcMgr::setActorJobTypeAndPrio(JobType type, s32 prio, bool x) { + mStatus = Status::ProcessingActorJobs; + mJobType = type; + mCurrentlyProcessingPrio = prio; + mUnk2 = x; +} + +void BaseProcMgr::goIdle() { + mStatus = Status::Idle; + mJobType = JobType::Invalid; + mIsPushingJobs = false; + mUnk2 = false; + mEnableExtraJobPush = false; + mCurrentlyProcessingPrio = 8; +} + +void BaseProcMgr::clearMode() { + mMode = Mode::_0; +} + +bool BaseProcMgr::isHighPriorityThread() const { + const auto current_thread = sead::ThreadMgr::instance()->getCurrentThread(); + + if (!current_thread) + return false; + + const auto id = current_thread->getId(); + + if (!current_thread->isDefaultPriority()) + return false; + + return id == mMainThreadId || id == mHavokThreadId1 || id == mHavokThreadId2; +} + +void BaseProcMgr::incrementUnk3() { + if (mUnk3 != 0xFF) + ++mUnk3; +} + +void BaseProcMgr::decrementUnk3() { + if (mUnk3 != 0) + --mUnk3; +} + +sead::CriticalSection* BaseProcMgr::lockProcMap() { + mProcMapCS.lock(); + return &mProcMapCS; +} + +void BaseProcMgr::unlockProcMap() { + mLastProcMapNode = nullptr; + mProcMapCS.unlock(); +} + +} // namespace ksys::act -- cgit v1.2.3