diff options
| author | Léo Lam <leo@leolam.fr> | 2021-03-18 12:48:30 +0100 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2021-03-18 14:55:31 +0100 |
| commit | fd7e47c1d9ef09cb042f5b292a6539306161ef81 (patch) | |
| tree | de3fadecf5702c7435523826f057a1faa7431741 /src/KingSystem/ActorSystem/actBaseProcMgr.cpp | |
| parent | 298fa864910e86819a36fac1b8a62f45556de1bb (diff) | |
ksys/act: Implement BaseProc iteration
Diffstat (limited to 'src/KingSystem/ActorSystem/actBaseProcMgr.cpp')
| -rw-r--r-- | src/KingSystem/ActorSystem/actBaseProcMgr.cpp | 31 |
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); |
