summaryrefslogtreecommitdiff
path: root/src/KingSystem/ActorSystem/actBaseProcUnit.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2021-03-13 15:42:45 +0100
committerLéo Lam <leo@leolam.fr>2021-03-13 22:11:49 +0100
commit113cc3bb53cacf51a7beab9c0c0d7056b9358a27 (patch)
tree0feb02e79cbde01fb90e0f65e56f3d519bb77bfe /src/KingSystem/ActorSystem/actBaseProcUnit.cpp
parent10a7871227c71372c873d677675c4172fdf7f7d9 (diff)
ksys/act: Finish BaseProcUnit
Diffstat (limited to 'src/KingSystem/ActorSystem/actBaseProcUnit.cpp')
-rw-r--r--src/KingSystem/ActorSystem/actBaseProcUnit.cpp122
1 files changed, 96 insertions, 26 deletions
diff --git a/src/KingSystem/ActorSystem/actBaseProcUnit.cpp b/src/KingSystem/ActorSystem/actBaseProcUnit.cpp
index b0b466b2..cac5c864 100644
--- a/src/KingSystem/ActorSystem/actBaseProcUnit.cpp
+++ b/src/KingSystem/ActorSystem/actBaseProcUnit.cpp
@@ -8,48 +8,118 @@
namespace ksys::act {
-// NON_MATCHING: Equivalent but branches are off.
+bool BaseProcUnit::deleteProc(u32, BaseProcHandle* handle) {
+ ActorLinkConstDataAccess accessor;
+
+ {
+ const auto lock = sead::makeScopedLock(mCS);
+ BaseProcHandle* current_handle = mHandle;
+ if (current_handle == handle) {
+ if (mProc)
+ accessor.acquire(mProc);
+
+ if (mStatus == Status::_1 || mProc) {
+ mHandle.compareExchange(handle, &BaseProcHandle::sDummyHandle);
+ } else {
+ mStatus = Status::Unused;
+ mHandle = nullptr;
+ }
+ } else {
+ sead::FixedSafeString<256> message;
+ message.format("BaseProcUnit:(%p, %p), 呼び出し(%p)", this, current_handle, handle);
+ util::PrintDebug(message);
+ }
+ }
+
+ if (accessor.hasProc())
+ accessor.mProc->deleteLater(BaseProc::DeleteReason::_2);
+
+ return true;
+}
+
bool BaseProcUnit::setProc(BaseProc* proc) {
- bool ret;
static constexpr const char* sStateNames[] = {"Init", "Calc", "Sleep", "Delete"};
auto lock = sead::makeScopedLock(mCS);
+
if (mProc)
mProc = nullptr;
- if (mHandle == &BaseProcHandle::sDummyHandle)
+ if (isParentHandleDefault())
return false;
- if (mHandle) {
- if (mFlags != 1) {
- sead::FixedSafeString<64> message;
+ const auto print_info = [&] {
+ sead::FixedSafeString<64> message;
+ if (proc) {
+ message.format("%s, %d, %d, %s, ( %p:%p )", proc->getName().cstr(), u32(mStatus.load()),
+ proc->isInitialized(), sStateNames[u8(proc->getState())], this,
+ mHandle.load());
+ } else {
+ message.format("なし, %d, ?, ?, ( %p:%p )", u32(mStatus.load()), this, mHandle.load());
+ }
+ util::PrintDebug(message);
+ };
- if (proc)
- message.format("%s, %d, %d, %s, ( %p:%p )", proc->getName().cstr(), mFlags,
- proc->isInitialized(), sStateNames[u8(proc->getState())], this,
- mHandle.load());
- else
- message.format("なし, %d, ?, ?, ( %p:%p )", mFlags, this, mHandle.load());
+ if (!mHandle) {
+ print_info();
+ return false;
+ }
- util::PrintDebug(message);
- }
- mProc = proc;
- mFlags = 2;
- ret = true;
- } else {
+ if (mStatus != Status::_1)
+ print_info();
+
+ mProc = proc;
+ mStatus = Status::Ready;
+ return true;
+}
+
+void BaseProcUnit::reset() {
+ auto* handle = getHandle();
+ if (handle != &BaseProcHandle::sDummyHandle) {
+ sead::FixedSafeString<256> message;
+ message.format("BaseProcUnit:%p, %p", this, handle);
+ util::PrintDebug(message);
+ }
+ mProc = nullptr;
+ mStatus = Status::Unused;
+ mHandle = nullptr;
+}
+
+void BaseProcUnit::cleanUp(BaseProc* proc, bool set_status_5) {
+ const auto lock = sead::makeScopedLock(mCS);
+
+ mProc = nullptr;
+
+ const auto print_info = [&] {
sead::FixedSafeString<64> message;
+ message.format("%d, ( %p:%p )", u32(mStatus.load()), this, mHandle.load());
+ util::PrintDebug(message);
+ };
- if (proc)
- message.format("%s, %d, %d, %s, ( %p:%p )", proc->getName().cstr(), mFlags,
- proc->isInitialized(), sStateNames[u8(proc->getState())], this,
- mHandle.load());
- else
- message.format("なし, %d, ?, ?, ( %p:%p )", mFlags, this, mHandle.load());
+ if (isParentHandleDefault()) {
+ reset();
+ } else if (!mHandle) {
+ print_info();
+ } else {
+ const auto status = mStatus.load();
+ if (status == Status::Unused || (status > Status::_3 && status != Status::_5))
+ print_info();
+ mStatus = set_status_5 ? Status::_5 : Status::_3;
+ }
+}
+void BaseProcUnit::unlinkProc(BaseProc* proc) {
+ const auto lock = sead::makeScopedLock(mCS);
+
+ if (mProc != proc && mProc != nullptr) {
+ sead::FixedSafeString<256> message;
+ message.format("BaseProcUnit:(%p:%p), BaseProc:(%s:%p), 残りBaseProc(%s:%p)", this,
+ mHandle.load(), proc->getName().cstr(), proc, mProc->getName().cstr(),
+ mProc);
util::PrintDebug(message);
- ret = false;
}
- return ret;
+
+ reset();
}
bool BaseProcUnit::isParentHandleDefault() const {