summaryrefslogtreecommitdiff
path: root/src/KingSystem/ActorSystem/actBaseProcLinkDataMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/KingSystem/ActorSystem/actBaseProcLinkDataMgr.cpp')
-rw-r--r--src/KingSystem/ActorSystem/actBaseProcLinkDataMgr.cpp52
1 files changed, 52 insertions, 0 deletions
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 <prim/seadScopedLock.h>
+#include <thread/seadThread.h>
+#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