summaryrefslogtreecommitdiff
path: root/src/KingSystem/ActorSystem/actBaseProcUnit.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2021-03-14 14:05:38 +0100
committerLéo Lam <leo@leolam.fr>2021-03-14 17:11:38 +0100
commit4f2c0a60798d07bc77121e4ef02fbf17075c52da (patch)
tree8e6da2b84da5ea999480c00d32167f254150cdc2 /src/KingSystem/ActorSystem/actBaseProcUnit.cpp
parente36bc464b6fb19e80a1755b469b8a29295d080cc (diff)
ksys/act: Finish BaseProcHandle
Diffstat (limited to 'src/KingSystem/ActorSystem/actBaseProcUnit.cpp')
-rw-r--r--src/KingSystem/ActorSystem/actBaseProcUnit.cpp30
1 files changed, 21 insertions, 9 deletions
diff --git a/src/KingSystem/ActorSystem/actBaseProcUnit.cpp b/src/KingSystem/ActorSystem/actBaseProcUnit.cpp
index cac5c864..23baa4ea 100644
--- a/src/KingSystem/ActorSystem/actBaseProcUnit.cpp
+++ b/src/KingSystem/ActorSystem/actBaseProcUnit.cpp
@@ -8,7 +8,19 @@
namespace ksys::act {
-bool BaseProcUnit::deleteProc(u32, BaseProcHandle* handle) {
+BaseProcUnitPool gUnitPool{};
+BaseProcHandle gDummyProcHandle;
+
+BaseProcUnit::~BaseProcUnit() {
+ deleteProc(0, nullptr);
+}
+
+bool BaseProcUnit::deleteProc([[maybe_unused]] u32 x, BaseProcHandle* handle) {
+#ifdef MATCHING_HACK_NX_CLANG
+ // Ensure x is not optimized out.
+ __builtin_assume(x);
+#endif
+
ActorLinkConstDataAccess accessor;
{
@@ -18,8 +30,8 @@ bool BaseProcUnit::deleteProc(u32, BaseProcHandle* handle) {
if (mProc)
accessor.acquire(mProc);
- if (mStatus == Status::_1 || mProc) {
- mHandle.compareExchange(handle, &BaseProcHandle::sDummyHandle);
+ if (mStatus == Status::Initializing || mProc) {
+ mHandle.compareExchange(handle, &gDummyProcHandle);
} else {
mStatus = Status::Unused;
mHandle = nullptr;
@@ -65,7 +77,7 @@ bool BaseProcUnit::setProc(BaseProc* proc) {
return false;
}
- if (mStatus != Status::_1)
+ if (mStatus != Status::Initializing)
print_info();
mProc = proc;
@@ -75,7 +87,7 @@ bool BaseProcUnit::setProc(BaseProc* proc) {
void BaseProcUnit::reset() {
auto* handle = getHandle();
- if (handle != &BaseProcHandle::sDummyHandle) {
+ if (handle != &gDummyProcHandle) {
sead::FixedSafeString<256> message;
message.format("BaseProcUnit:%p, %p", this, handle);
util::PrintDebug(message);
@@ -85,7 +97,7 @@ void BaseProcUnit::reset() {
mHandle = nullptr;
}
-void BaseProcUnit::cleanUp(BaseProc* proc, bool set_status_5) {
+void BaseProcUnit::cleanUp(BaseProc* proc, bool is_cancellation) {
const auto lock = sead::makeScopedLock(mCS);
mProc = nullptr;
@@ -102,9 +114,9 @@ void BaseProcUnit::cleanUp(BaseProc* proc, bool set_status_5) {
print_info();
} else {
const auto status = mStatus.load();
- if (status == Status::Unused || (status > Status::_3 && status != Status::_5))
+ if (status == Status::Unused || (status > Status::NoProc && status != Status::Cancelled))
print_info();
- mStatus = set_status_5 ? Status::_5 : Status::_3;
+ mStatus = is_cancellation ? Status::Cancelled : Status::NoProc;
}
}
@@ -123,7 +135,7 @@ void BaseProcUnit::unlinkProc(BaseProc* proc) {
}
bool BaseProcUnit::isParentHandleDefault() const {
- return mHandle == &BaseProcHandle::sDummyHandle;
+ return mHandle == &gDummyProcHandle;
}
} // namespace ksys::act