mirror of https://github.com/zeldaret/botw.git
Merge pull request #1 from notyouraveragehooman/master
BaseProc parent and child connections
This commit is contained in:
commit
31e4ddd572
|
@ -89467,25 +89467,25 @@
|
|||
0x00000071011ba200,ActorBase::x,112,
|
||||
0x00000071011ba270,ActorBase::queueExtraJobPush,68,_ZN4ksys3act8BaseProc18queueExtraJobPush_ENS0_7JobTypeE
|
||||
0x00000071011ba2b4,ActorBase::shouldSkipJobPush,144,
|
||||
0x00000071011ba344,ActorBase::getConnectedCalcParent,32,
|
||||
0x00000071011ba344,ActorBase::getConnectedCalcParent,32,_ZNK4ksys3act8BaseProc22getConnectedCalcParentEv
|
||||
0x00000071011ba364,ActorBase::jobInvoked,564,
|
||||
0x00000071011ba598,ActorBase::updateState,1076,_ZN4ksys3act8BaseProc18processStateUpdateEh!
|
||||
0x00000071011ba9cc,ActorBase::afterUpdateState,48,_ZN4ksys3act8BaseProc17afterUpdateState_Ev
|
||||
0x00000071011BA9FC,_ZN4ksys3act8BaseProc17x00000071011ba9fcEv,0xBC,_ZN4ksys3act8BaseProc17x00000071011ba9fcEv
|
||||
0x00000071011baab8,ActorBase::setProcStateFlag,124,
|
||||
0x00000071011bab34,ActorBase::acquire,196,
|
||||
0x00000071011babf8,ActorBase::release,36,
|
||||
0x00000071011babf8,ActorBase::release,36,_ZN4ksys3act8BaseProc7releaseEv
|
||||
0x00000071011bac1c,ActorBase::doDelete,244,
|
||||
0x00000071011bad10,ActorBase::preDelete,164,_ZN4ksys3act8BaseProc11doPreDeleteEPb
|
||||
0x00000071011badb4,ActorBase::setJobPriority,288,
|
||||
0x00000071011baed4,ActorBase::setJobPriority2,288,
|
||||
0x00000071011baff4,ActorBase::sleep,308,
|
||||
0x00000071011bb128,ActorBase::wakeUp,484,
|
||||
0x00000071011bb30c,ActorBase::getConnectedCalcChild,32,
|
||||
0x00000071011bb32c,ActorBase::setConnectedCalcChild,248,
|
||||
0x00000071011bb424,ActorBase::setConnectedCalcParent,248,
|
||||
0x00000071011bb51c,ActorBase::resetConnectedCalcChild,188,
|
||||
0x00000071011bb5d8,ActorBase::resetConnectedCalcParent,188,
|
||||
0x00000071011bb30c,ActorBase::getConnectedCalcChild,32,_ZNK4ksys3act8BaseProc21getConnectedCalcChildEv
|
||||
0x00000071011bb32c,ActorBase::setConnectedCalcChild,248,_ZN4ksys3act8BaseProc21setConnectedCalcChildEPS1_b
|
||||
0x00000071011bb424,ActorBase::setConnectedCalcParent,248,_ZN4ksys3act8BaseProc22setConnectedCalcParentEPS1_b
|
||||
0x00000071011bb51c,ActorBase::resetConnectedCalcChild,188,_ZN4ksys3act8BaseProc23resetConnectedCalcChildEb
|
||||
0x00000071011bb5d8,ActorBase::resetConnectedCalcParent,188,_ZN4ksys3act8BaseProc24resetConnectedCalcParentEb
|
||||
0x00000071011bb6a0,ActorBase::setCreatePriorityState2,12,
|
||||
0x00000071011bb6ac,ActorBase::rtti1,112,_ZNK4ksys3act8BaseProc27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
|
||||
0x00000071011bb71c,ActorBase::rtti2,92,_ZNK4ksys3act8BaseProc18getRuntimeTypeInfoEv
|
||||
|
|
Can't render this file because it is too large.
|
|
@ -66,7 +66,7 @@ bool BaseProc::deleteLater(DeleteReason reason) {
|
|||
}
|
||||
}
|
||||
|
||||
if (!BaseProcMgr::instance()->addToUpdateStateList(*this))
|
||||
if (!BaseProcMgr::instance()->addToUpdateStateList(*this, StateFlags::RequestDelete))
|
||||
onDeleteRequested_(reason);
|
||||
|
||||
if (!is_high_prio)
|
||||
|
@ -425,4 +425,83 @@ bool BaseProc::x00000071011ba9fc() {
|
|||
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
|
||||
|
|
|
@ -107,11 +107,11 @@ public:
|
|||
void release();
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
bool isSpecialJobType(JobType type);
|
||||
|
@ -282,7 +282,7 @@ protected:
|
|||
sead::ListNode mDeleteListNode;
|
||||
BaseProcMapNode mMapNode{this};
|
||||
BaseProcUnit* mProcUnit = nullptr;
|
||||
sead::Atomic<u32> mRefCount = 0;
|
||||
sead::Atomic<s32> mRefCount = 0;
|
||||
|
||||
private:
|
||||
void unlinkProcUnit_();
|
||||
|
|
|
@ -69,7 +69,7 @@ public:
|
|||
void unregisterProc(BaseProc& proc);
|
||||
|
||||
void addToPreDeleteList(BaseProc& proc);
|
||||
bool addToUpdateStateList(BaseProc& proc);
|
||||
bool addToUpdateStateList(BaseProc& proc, BaseProc::StateFlags flags);
|
||||
void eraseFromPreDeleteList(BaseProc& proc);
|
||||
void eraseFromUpdateStateList(BaseProc& proc);
|
||||
void processPreDeleteList();
|
||||
|
@ -210,11 +210,10 @@ private:
|
|||
};
|
||||
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);
|
||||
doAddToUpdateStateList_(proc);
|
||||
return (proc.mStateFlags.set(BaseProc::StateFlags::RequestDelete) &
|
||||
u32(BaseProc::StateFlags::RequestDelete)) != 0;
|
||||
return (proc.mStateFlags.set(flag) & u32(flag)) != 0;
|
||||
}
|
||||
|
||||
} // namespace ksys::act
|
||||
|
|
Loading…
Reference in New Issue