summaryrefslogtreecommitdiff
path: root/src/KingSystem/ActorSystem/actBaseProcMgr.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2021-03-18 12:48:30 +0100
committerLéo Lam <leo@leolam.fr>2021-03-18 14:55:31 +0100
commitfd7e47c1d9ef09cb042f5b292a6539306161ef81 (patch)
treede3fadecf5702c7435523826f057a1faa7431741 /src/KingSystem/ActorSystem/actBaseProcMgr.cpp
parent298fa864910e86819a36fac1b8a62f45556de1bb (diff)
ksys/act: Implement BaseProc iteration
Diffstat (limited to 'src/KingSystem/ActorSystem/actBaseProcMgr.cpp')
-rw-r--r--src/KingSystem/ActorSystem/actBaseProcMgr.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/KingSystem/ActorSystem/actBaseProcMgr.cpp b/src/KingSystem/ActorSystem/actBaseProcMgr.cpp
index bd228de3..a3ca8407 100644
--- a/src/KingSystem/ActorSystem/actBaseProcMgr.cpp
+++ b/src/KingSystem/ActorSystem/actBaseProcMgr.cpp
@@ -470,6 +470,37 @@ inline bool BaseProcMgr::checkFilters(BaseProc* proc, ProcFilters filters) const
return !filters.isOff(ProcFilter::SkipAccessCheck) || isAccessingProcSafe(proc, nullptr);
}
+BaseProc* BaseProcMgr::getNextProc(sead::CriticalSection* cs, BaseProc* current_proc,
+ BaseProcMgr::ProcFilters filters) {
+ if (&mProcMapCS != cs)
+ return nullptr;
+
+ BaseProcMapNode* node = nullptr;
+ if (current_proc)
+ node = current_proc->mMapNode.next();
+ else
+ node = mLastProcMapNode = mProcMap.startIterating();
+
+ if (!node && mLastProcMapNode)
+ node = mLastProcMapNode = mProcMap.nextNode(mLastProcMapNode);
+
+ auto* proc = node ? node->proc() : nullptr;
+ while (proc) {
+ if (checkFilters(proc, filters))
+ return proc;
+
+ node = proc->mMapNode.next();
+ if (!node && mLastProcMapNode)
+ node = mLastProcMapNode = mProcMap.nextNode(mLastProcMapNode);
+
+ if (!node)
+ return nullptr;
+
+ proc = node->proc();
+ }
+ return nullptr;
+}
+
BaseProc* BaseProcMgr::getProc(const sead::SafeString& name, BaseProcMgr::ProcFilters filters) {
const auto lock = sead::makeScopedLock(mProcMapCS);