mirror of
https://github.com/zeldaret/botw
synced 2026-05-30 17:05:37 -04:00
Initial commit
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
#include "KingSystem/ActorSystem/actBaseProcMgr.h"
|
||||
#include <prim/seadScopedLock.h>
|
||||
#include <thread/seadThread.h>
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user