Merge pull request #1 from notyouraveragehooman/master

BaseProc parent and child connections
This commit is contained in:
Léo Lam 2020-08-22 10:25:31 +02:00 committed by GitHub
commit 31e4ddd572
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 93 additions and 15 deletions

View File

@ -89467,25 +89467,25 @@
0x00000071011ba200,ActorBase::x,112, 0x00000071011ba200,ActorBase::x,112,
0x00000071011ba270,ActorBase::queueExtraJobPush,68,_ZN4ksys3act8BaseProc18queueExtraJobPush_ENS0_7JobTypeE 0x00000071011ba270,ActorBase::queueExtraJobPush,68,_ZN4ksys3act8BaseProc18queueExtraJobPush_ENS0_7JobTypeE
0x00000071011ba2b4,ActorBase::shouldSkipJobPush,144, 0x00000071011ba2b4,ActorBase::shouldSkipJobPush,144,
0x00000071011ba344,ActorBase::getConnectedCalcParent,32, 0x00000071011ba344,ActorBase::getConnectedCalcParent,32,_ZNK4ksys3act8BaseProc22getConnectedCalcParentEv
0x00000071011ba364,ActorBase::jobInvoked,564, 0x00000071011ba364,ActorBase::jobInvoked,564,
0x00000071011ba598,ActorBase::updateState,1076,_ZN4ksys3act8BaseProc18processStateUpdateEh! 0x00000071011ba598,ActorBase::updateState,1076,_ZN4ksys3act8BaseProc18processStateUpdateEh!
0x00000071011ba9cc,ActorBase::afterUpdateState,48,_ZN4ksys3act8BaseProc17afterUpdateState_Ev 0x00000071011ba9cc,ActorBase::afterUpdateState,48,_ZN4ksys3act8BaseProc17afterUpdateState_Ev
0x00000071011BA9FC,_ZN4ksys3act8BaseProc17x00000071011ba9fcEv,0xBC,_ZN4ksys3act8BaseProc17x00000071011ba9fcEv 0x00000071011BA9FC,_ZN4ksys3act8BaseProc17x00000071011ba9fcEv,0xBC,_ZN4ksys3act8BaseProc17x00000071011ba9fcEv
0x00000071011baab8,ActorBase::setProcStateFlag,124, 0x00000071011baab8,ActorBase::setProcStateFlag,124,
0x00000071011bab34,ActorBase::acquire,196, 0x00000071011bab34,ActorBase::acquire,196,
0x00000071011babf8,ActorBase::release,36, 0x00000071011babf8,ActorBase::release,36,_ZN4ksys3act8BaseProc7releaseEv
0x00000071011bac1c,ActorBase::doDelete,244, 0x00000071011bac1c,ActorBase::doDelete,244,
0x00000071011bad10,ActorBase::preDelete,164,_ZN4ksys3act8BaseProc11doPreDeleteEPb 0x00000071011bad10,ActorBase::preDelete,164,_ZN4ksys3act8BaseProc11doPreDeleteEPb
0x00000071011badb4,ActorBase::setJobPriority,288, 0x00000071011badb4,ActorBase::setJobPriority,288,
0x00000071011baed4,ActorBase::setJobPriority2,288, 0x00000071011baed4,ActorBase::setJobPriority2,288,
0x00000071011baff4,ActorBase::sleep,308, 0x00000071011baff4,ActorBase::sleep,308,
0x00000071011bb128,ActorBase::wakeUp,484, 0x00000071011bb128,ActorBase::wakeUp,484,
0x00000071011bb30c,ActorBase::getConnectedCalcChild,32, 0x00000071011bb30c,ActorBase::getConnectedCalcChild,32,_ZNK4ksys3act8BaseProc21getConnectedCalcChildEv
0x00000071011bb32c,ActorBase::setConnectedCalcChild,248, 0x00000071011bb32c,ActorBase::setConnectedCalcChild,248,_ZN4ksys3act8BaseProc21setConnectedCalcChildEPS1_b
0x00000071011bb424,ActorBase::setConnectedCalcParent,248, 0x00000071011bb424,ActorBase::setConnectedCalcParent,248,_ZN4ksys3act8BaseProc22setConnectedCalcParentEPS1_b
0x00000071011bb51c,ActorBase::resetConnectedCalcChild,188, 0x00000071011bb51c,ActorBase::resetConnectedCalcChild,188,_ZN4ksys3act8BaseProc23resetConnectedCalcChildEb
0x00000071011bb5d8,ActorBase::resetConnectedCalcParent,188, 0x00000071011bb5d8,ActorBase::resetConnectedCalcParent,188,_ZN4ksys3act8BaseProc24resetConnectedCalcParentEb
0x00000071011bb6a0,ActorBase::setCreatePriorityState2,12, 0x00000071011bb6a0,ActorBase::setCreatePriorityState2,12,
0x00000071011bb6ac,ActorBase::rtti1,112,_ZNK4ksys3act8BaseProc27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE 0x00000071011bb6ac,ActorBase::rtti1,112,_ZNK4ksys3act8BaseProc27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x00000071011bb71c,ActorBase::rtti2,92,_ZNK4ksys3act8BaseProc18getRuntimeTypeInfoEv 0x00000071011bb71c,ActorBase::rtti2,92,_ZNK4ksys3act8BaseProc18getRuntimeTypeInfoEv

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

View File

@ -66,7 +66,7 @@ bool BaseProc::deleteLater(DeleteReason reason) {
} }
} }
if (!BaseProcMgr::instance()->addToUpdateStateList(*this)) if (!BaseProcMgr::instance()->addToUpdateStateList(*this, StateFlags::RequestDelete))
onDeleteRequested_(reason); onDeleteRequested_(reason);
if (!is_high_prio) if (!is_high_prio)
@ -425,4 +425,83 @@ bool BaseProc::x00000071011ba9fc() {
return true; return true;
} }
void BaseProc::release() {
if (mRefCount >= 1)
mRefCount--;
}
BaseProc* BaseProc::getConnectedCalcParent() const {
if (mConnectedCalcParent == nullptr || mConnectedCalcParent->mState == State::Delete)
return nullptr;
return mConnectedCalcParent;
}
bool BaseProc::setConnectedCalcParent(BaseProc* parent, bool delete_parent_on_delete) {
if (parent == nullptr)
return false;
if (isDeletedOrDeleting() || parent->isDeletedOrDeleting())
return false;
if (BaseProcMgr::instance()->addToUpdateStateList(*this, StateFlags::RequestSetParent))
return false;
mConnectedCalcParentNew = parent;
mFlags.change(Flags::DeleteParentOnDelete, delete_parent_on_delete);
return true;
}
void BaseProc::resetConnectedCalcParent(bool clear_existing_set_request) {
if (isDeletedOrDeleting())
return;
if (clear_existing_set_request) {
mStateFlags.reset(StateFlags::RequestSetParent);
mConnectedCalcParentNew = nullptr;
}
if (mConnectedCalcParent)
BaseProcMgr::instance()->addToUpdateStateList(*this, StateFlags::RequestResetParent);
}
BaseProc* BaseProc::getConnectedCalcChild() const {
if (!mConnectedCalcChild || mConnectedCalcChild->mState == State::Delete)
return nullptr;
return mConnectedCalcChild;
}
bool BaseProc::setConnectedCalcChild(BaseProc* child, bool delete_child_on_delete) {
if (child == nullptr)
return false;
if (isDeletedOrDeleting() || child->isDeletedOrDeleting())
return false;
if (BaseProcMgr::instance()->addToUpdateStateList(*this, StateFlags::RequestSetChild))
return false;
mConnectedCalcChildNew = child;
mFlags.change(Flags::DeleteChildOnDelete, delete_child_on_delete);
return true;
}
void BaseProc::resetConnectedCalcChild(bool clear_existing_set_request) {
if (isDeletedOrDeleting())
return;
if (clear_existing_set_request) {
mStateFlags.reset(StateFlags::RequestSetChild);
mConnectedCalcChildNew = nullptr;
}
if (mConnectedCalcChild)
BaseProcMgr::instance()->addToUpdateStateList(*this, StateFlags::RequestResetChild);
}
} // namespace ksys::act } // namespace ksys::act

View File

@ -107,11 +107,11 @@ public:
void release(); void release();
BaseProc* getConnectedCalcParent() const; BaseProc* getConnectedCalcParent() const;
void setConnectedCalcParent(BaseProc* parent, bool delete_parent_on_delete); bool setConnectedCalcParent(BaseProc* parent, bool delete_parent_on_delete);
void resetConnectedCalcParent(bool clear_existing_set_request); void resetConnectedCalcParent(bool clear_existing_set_request);
BaseProc* getConnectedCalcChild() const; BaseProc* getConnectedCalcChild() const;
void setConnectedCalcChild(BaseProc* child, bool delete_child_on_delete); bool setConnectedCalcChild(BaseProc* child, bool delete_child_on_delete);
void resetConnectedCalcChild(bool clear_existing_set_request); void resetConnectedCalcChild(bool clear_existing_set_request);
bool isSpecialJobType(JobType type); bool isSpecialJobType(JobType type);
@ -282,7 +282,7 @@ protected:
sead::ListNode mDeleteListNode; sead::ListNode mDeleteListNode;
BaseProcMapNode mMapNode{this}; BaseProcMapNode mMapNode{this};
BaseProcUnit* mProcUnit = nullptr; BaseProcUnit* mProcUnit = nullptr;
sead::Atomic<u32> mRefCount = 0; sead::Atomic<s32> mRefCount = 0;
private: private:
void unlinkProcUnit_(); void unlinkProcUnit_();

View File

@ -69,7 +69,7 @@ public:
void unregisterProc(BaseProc& proc); void unregisterProc(BaseProc& proc);
void addToPreDeleteList(BaseProc& proc); void addToPreDeleteList(BaseProc& proc);
bool addToUpdateStateList(BaseProc& proc); bool addToUpdateStateList(BaseProc& proc, BaseProc::StateFlags flags);
void eraseFromPreDeleteList(BaseProc& proc); void eraseFromPreDeleteList(BaseProc& proc);
void eraseFromUpdateStateList(BaseProc& proc); void eraseFromUpdateStateList(BaseProc& proc);
void processPreDeleteList(); void processPreDeleteList();
@ -210,11 +210,10 @@ private:
}; };
KSYS_CHECK_SIZE_NX150(BaseProcMgr, 0x21a0); KSYS_CHECK_SIZE_NX150(BaseProcMgr, 0x21a0);
inline bool BaseProcMgr::addToUpdateStateList(BaseProc& proc) { inline bool BaseProcMgr::addToUpdateStateList(BaseProc& proc, BaseProc::StateFlags flag) {
auto lock = sead::makeScopedLock(mProcUpdateStateListCS); auto lock = sead::makeScopedLock(mProcUpdateStateListCS);
doAddToUpdateStateList_(proc); doAddToUpdateStateList_(proc);
return (proc.mStateFlags.set(BaseProc::StateFlags::RequestDelete) & return (proc.mStateFlags.set(flag) & u32(flag)) != 0;
u32(BaseProc::StateFlags::RequestDelete)) != 0;
} }
} // namespace ksys::act } // namespace ksys::act