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 --- .../ActorSystem/actBaseProcLinkDataMgr.cpp | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/KingSystem/ActorSystem/actBaseProcLinkDataMgr.cpp (limited to 'src/KingSystem/ActorSystem/actBaseProcLinkDataMgr.cpp') diff --git a/src/KingSystem/ActorSystem/actBaseProcLinkDataMgr.cpp b/src/KingSystem/ActorSystem/actBaseProcLinkDataMgr.cpp new file mode 100644 index 00000000..cc986835 --- /dev/null +++ b/src/KingSystem/ActorSystem/actBaseProcLinkDataMgr.cpp @@ -0,0 +1,52 @@ +#include "KingSystem/ActorSystem/actBaseProcLinkDataMgr.h" +#include +#include +#include "KingSystem/ActorSystem/actBaseProc.h" + +namespace ksys::act { + +SEAD_SINGLETON_DISPOSER_IMPL(BaseProcLinkDataMgr) + +bool BaseProcLinkDataMgr::acquireLink(BaseProc* proc) { + auto lock = sead::makeScopedLock(mCS); + s32 index = mIndex; + for (s32 i = 0; i < mData.size(); ++i) { + const s32 j = index == 0x800 ? 0 : index; + auto& data = mData[j]; + if (data.mId == u32(-1)) { + { + auto data_lock = sead::makeScopedLock(data.mCS); + data.mProc = proc; + data.mId = proc->mId; + proc->mBaseProcLinkData = &data; + } + mIndex = j + 1; + return true; + } + index = j + 1; + } + + for (s32 i = 0; i < mData.size(); ++i) { + auto data_lock = sead::makeScopedLock(mData[i].mCS); + // Debug code was probably here? + } + + return false; +} + +bool BaseProcLinkDataMgr::releaseLink(BaseProc* proc) { + auto* data = proc->mBaseProcLinkData; + if (!data) + return false; + + const auto thread = sead::ThreadMgr::instance()->getCurrentThread(); + thread->getPriority(); + + auto lock = sead::makeScopedLock(data->mCS); + data->mProc = nullptr; + data->mId = -1; + proc->mBaseProcLinkData = nullptr; + return true; +} + +} // namespace ksys::act -- cgit v1.2.3