diff options
| author | Léo Lam <leo@leolam.fr> | 2021-03-14 14:05:38 +0100 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2021-03-14 17:11:38 +0100 |
| commit | 4f2c0a60798d07bc77121e4ef02fbf17075c52da (patch) | |
| tree | 8e6da2b84da5ea999480c00d32167f254150cdc2 /src/KingSystem/ActorSystem/actBaseProcUnit.h | |
| parent | e36bc464b6fb19e80a1755b469b8a29295d080cc (diff) | |
ksys/act: Finish BaseProcHandle
Diffstat (limited to 'src/KingSystem/ActorSystem/actBaseProcUnit.h')
| -rw-r--r-- | src/KingSystem/ActorSystem/actBaseProcUnit.h | 52 |
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 |
