ksys/act: Finish BaseProcLinkData

This commit is contained in:
Léo Lam 2020-08-20 12:19:00 +02:00
parent c9207a3cc3
commit f92ab2f559
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
3 changed files with 33 additions and 3 deletions

View File

@ -89524,8 +89524,8 @@
0x00000071011bc464,sinitBaseProcHandle,172, 0x00000071011bc464,sinitBaseProcHandle,172,
0x00000071011bc510,_ZN12BaseProcLinkC2Ev,20,_ZN4ksys3act12BaseProcLinkC1Ev 0x00000071011bc510,_ZN12BaseProcLinkC2Ev,20,_ZN4ksys3act12BaseProcLinkC1Ev
0x00000071011bc524,_ZN12BaseProcLink12acquireActorER13ActorAccessorP9ActorBase,308, 0x00000071011bc524,_ZN12BaseProcLink12acquireActorER13ActorAccessorP9ActorBase,308,
0x00000071011bc658,BaseProcLinkData::lockCritSectionOnGameThreadOrHavokThread,68, 0x00000071011bc658,BaseProcLinkData::lockCritSectionOnGameThreadOrHavokThread,68,_ZN4ksys3act16BaseProcLinkData12lockIfNeededEv
0x00000071011bc69c,BaseProcLinkData::checkIdAndEngaged,52, 0x00000071011bc69c,BaseProcLinkData::checkIdAndEngaged,52,_ZNK4ksys3act16BaseProcLinkData7getProcEjb
0x00000071011bc6d0,_ZN12BaseProcLink12fromAccessorER13ActorAccessor,276, 0x00000071011bc6d0,_ZN12BaseProcLink12fromAccessorER13ActorAccessor,276,
0x00000071011bc7e4,BaseProcLink::checkHasActorById,40, 0x00000071011bc7e4,BaseProcLink::checkHasActorById,40,
0x00000071011bc80c,_ZN12BaseProcLinkeqERS_,152, 0x00000071011bc80c,_ZN12BaseProcLinkeqERS_,152,

Can't render this file because it is too large.

View File

@ -2,11 +2,30 @@
#include <prim/seadScopedLock.h> #include <prim/seadScopedLock.h>
#include <thread/seadThread.h> #include <thread/seadThread.h>
#include "KingSystem/ActorSystem/actBaseProc.h" #include "KingSystem/ActorSystem/actBaseProc.h"
#include "KingSystem/ActorSystem/actBaseProcMgr.h"
namespace ksys::act { namespace ksys::act {
SEAD_SINGLETON_DISPOSER_IMPL(BaseProcLinkDataMgr) SEAD_SINGLETON_DISPOSER_IMPL(BaseProcLinkDataMgr)
BaseProc* BaseProcLinkData::getProc(u32 id, bool allow_deleted) const {
if (id == u32(-1) || mId != id)
return nullptr;
if (!allow_deleted && mProc && mProc->getState() == BaseProc::State::Delete)
return nullptr;
return mProc;
}
sead::CriticalSection* BaseProcLinkData::lockIfNeeded() {
if (BaseProcMgr::instance()->isHighPriorityThread())
return nullptr;
mCS.lock();
return &mCS;
}
bool BaseProcLinkDataMgr::acquireLink(BaseProc* proc) { bool BaseProcLinkDataMgr::acquireLink(BaseProc* proc) {
auto lock = sead::makeScopedLock(mCS); auto lock = sead::makeScopedLock(mCS);
s32 index = mIndex; s32 index = mIndex;

View File

@ -13,9 +13,20 @@ class BaseProc;
class BaseProcLinkData { class BaseProcLinkData {
public: public:
u32 id() const { return mId; } u32 id() const { return mId; }
BaseProc* proc() const { return mProc; }
s32 refCount() const { return mRefCount; } s32 refCount() const { return mRefCount; }
/// Get the stored BaseProc.
BaseProc* getProc() const { return mProc; }
/// Get the stored BaseProc or nullptr if its ID or state are unexpected.
/// @param id The expected ID.
/// @param allow_deleted Whether to allow the BaseProc to be in the Delete state.
BaseProc* getProc(u32 id, bool allow_deleted) const;
/// Locks the critical section if on a low priority thread and returns it;
/// unlocking it is the responsibility of the caller.
/// Returns nullptr if on a high priority thread. In that case, nothing needs to be done.
sead::CriticalSection* lockIfNeeded();
private: private:
friend class BaseProcLinkDataMgr; friend class BaseProcLinkDataMgr;