summaryrefslogtreecommitdiff
path: root/src/KingSystem/ActorSystem/actBaseProcUnit.h
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.h
parente36bc464b6fb19e80a1755b469b8a29295d080cc (diff)
ksys/act: Finish BaseProcHandle
Diffstat (limited to 'src/KingSystem/ActorSystem/actBaseProcUnit.h')
-rw-r--r--src/KingSystem/ActorSystem/actBaseProcUnit.h52
1 files changed, 41 insertions, 11 deletions
diff --git a/src/KingSystem/ActorSystem/actBaseProcUnit.h b/src/KingSystem/ActorSystem/actBaseProcUnit.h
index 20309485..07ccbabb 100644
--- a/src/KingSystem/ActorSystem/actBaseProcUnit.h
+++ b/src/KingSystem/ActorSystem/actBaseProcUnit.h
@@ -1,6 +1,7 @@
#pragma once
#include <basis/seadTypes.h>
+#include <container/seadSafeArray.h>
#include <thread/seadAtomic.h>
#include <thread/seadCriticalSection.h>
#include "KingSystem/ActorSystem/actBaseProcCreateTask.h"
@@ -12,25 +13,44 @@ class BaseProcHandle;
class BaseProcUnit {
public:
+ enum class Status : u32 {
+ Unused = 0,
+ Initializing = 1,
+ Ready = 2,
+ NoProc = 3,
+ _4 = 4,
+ Cancelled = 5,
+ };
+
+ BaseProcUnit() = default;
+ ~BaseProcUnit();
+
+ BaseProcUnit(const BaseProcUnit&) = delete;
+ BaseProcUnit(BaseProcUnit&&) = delete;
+ auto operator=(const BaseProcUnit&) = delete;
+ auto operator=(BaseProcUnit&&) = delete;
+
bool deleteProc(u32, BaseProcHandle* handle);
bool setProc(BaseProc* proc);
void unlinkProc(BaseProc* proc);
- void cleanUp(BaseProc* proc, bool set_status_5);
+ void cleanUp(BaseProc* proc, bool is_cancellation);
bool isParentHandleDefault() const;
+ Status getStatus() const { return mStatus; }
BaseProc* getProc() const { return mProc; }
+ BaseProcCreateTask& getCreateTask() { return mCreateTask; }
+ const BaseProcCreateTask& getCreateTask() const { return mCreateTask; }
+ sead::CriticalSection& getCS() { return mCS; }
+
bool isReady() const { return mStatus == Status::Ready; }
-private:
- enum class Status : u32 {
- Unused = 0,
- _1 = 1,
- Ready = 2,
- _3 = 3,
- _4 = 4,
- _5 = 5,
- };
+ bool compareExchangeHandle(BaseProcHandle* expected, BaseProcHandle* desired) {
+ return mHandle.compareExchange(expected, desired);
+ }
+
+ void setInitializingStatus() { mStatus = Status::Initializing; }
+private:
void reset();
BaseProcHandle* getHandle() const { return mHandle.load(); }
@@ -38,9 +58,19 @@ private:
sead::Atomic<Status> mStatus = Status::Unused;
sead::Atomic<BaseProcHandle*> mHandle{};
BaseProc* mProc{};
- BaseProcCreateTask mCreateTask;
+ BaseProcCreateTask mCreateTask{nullptr};
sead::CriticalSection mCS;
};
KSYS_CHECK_SIZE_NX150(BaseProcUnit, 0x2f0);
+struct BaseProcUnitPool {
+ BaseProcUnit* get(int i) { return &units[i]; }
+
+ sead::SafeArray<BaseProcUnit, 256> units;
+ int idx = 0;
+};
+
+extern BaseProcUnitPool gUnitPool;
+extern BaseProcHandle gDummyProcHandle;
+
} // namespace ksys::act