core::control::ControllerNode
控制链的生命周期节点基类。 Disabled 未使能,也不持有任何控制关系; Protected 已使能并处于保护态,不接受直接控制命令; Standalone 已使能、无控制者的直接控制态; Controlled 控制权已被 parent_ 指向的控制器取得。 节点状态与不变式: parent_ 非空当且仅当本节点为 Controlled;除正在推进的生命周期事务之外,失能的节点不持有 子节点(使能时父节点先取得子节点的控制权,最后才提交自身)。 enable() 先按“自身优先”的顺序锁住自身候选子树,不向上锁定祖先;已经使能的节点也必须 先锁定子树,才能幂等返回 true。使能失败时回滚本轮建立的状态与控制关系。 disable() 先锁住自身及沿 parent_ 向上的控制链,稳定根节点和控制关系,再补齐各层候选 子树,取得所在整棵候选树的锁。未建立活动控制边的候选引用也参与锁定。 任一节点锁获取失败,立即释放本轮已取得的全部锁并返回 false;失能预锁失败不执行钩子、 状态写入或控制关系修改,也不会取消或接管其他生命周期事务。 reverse=false 在完整树已锁定后失能当前节点及其控制链,释放各层直接子节点的控制权; 被释放的子节点及其后代保持使能。 reverse=true 要求当前节点无控制者,在完整候选树已锁定后自顶向下关闭活动子树。 未建立活动控制边的候选引用只参与锁定,不改变状态。 并发模型(单核,任务与 ISR 之间可相互抢占): 每个节点持有一把非阻塞 AtomicFlagLock,所有生命周期操作都必须取得节点锁。 所有状态与控制关系写入都在对应节点锁内完成;提交或回滚结束后才释放本轮节点锁。 预锁失败按递归栈逐层释放成功锁定的子树,不触碰失败节点或其他上下文持有的锁。失能在栈上 保存根节点,传播结束后沿不变的 children_ 解锁,不在节点中保存锁链。返回 true 表示整树 锁定且传播已完成,false 表示节点锁冲突或 reverse=true 的调用节点仍受控。同轮沿不同 候选路径重复访问同一节点也视为冲突;这种拓扑冲突不能靠重试消除。 使能是可回滚事务:失败的使能撤销本轮建立的状态与控制关系。enable() 返回 false 表示本轮 失败或存在竞争(例如候选子树正被其他操作锁定),调用者可以稍后重试。
继承关系
构造与析构
4ControllerNode
core::control::ControllerNode::ControllerNode ()=default
上游未提供说明。
IController/IController.hpp:186ControllerNode
core::control::ControllerNode::ControllerNode (ControllerNode &&)=delete
上游未提供说明。
IController/IController.hpp:57ControllerNode
core::control::ControllerNode::ControllerNode (const ControllerNode &)=delete
上游未提供说明。
IController/IController.hpp:55~ControllerNode
virtual core::control::ControllerNode::~ControllerNode ()
上游未提供说明。
IController/IController.hpp:54成员函数
25currentController
ControllerNode * core::control::ControllerNode::currentController () const noexcept
返回当前控制者的线程安全瞬时快照。 state() 与生命周期事务并发调用时,结果可能表示事务前或提交后的控制关系,不保证与另一次独立调用构成一致快照,也不延长返回对象的生命周期。
IController/IController.hpp:116disable
virtual bool core::control::ControllerNode::disable (bool reverse=false) noexcept=0
失能当前节点。 两种方向都先 try-lock 当前节点所在的整棵候选树:沿 parent_ 锁住祖先链,再补齐各层 候选子树。reverse=false 失能当前节点及其控制链,并释放各层直接子节点的控制权, 被释放的子节点及其后代保持使能。reverse=true 要求当前节点无控制者,只关闭活动子树。 未建立活动边的候选引用参与锁定,但不改变状态。 任一节点已被占用时返回 false,释放本轮取得的全部锁,不执行任何失能钩子、状态写入或 控制关系修改;调用者可以稍后重试。受控节点调用 reverse=true 也返回 false。 true 表示整树已锁定且请求的失能传播已经完成。
IController/IController.hpp:89disableTreeLocked
virtual void core::control::ControllerNode::disableTreeLocked () noexcept=0
在所在整棵候选树已锁定时执行活动子树失能。
IController/IController.hpp:221disableUpstreamLocked
virtual void core::control::ControllerNode::disableUpstreamLocked () noexcept=0
在所在整棵候选树已锁定时执行向上失能。
IController/IController.hpp:218enable
virtual bool core::control::ControllerNode::enable () noexcept=0
使能当前节点及其候选子树。 先取得自身及全部候选后代的节点锁;若已使能则幂等返回 true,不重建控制关系。 返回 false 表示本轮失败(自身或后代使能失败、控制权冲突、候选节点处于 Standalone) 或存在竞争,本轮的改动已被回滚。
IController/IController.hpp:75enableAndAcquireController
virtual bool core::control::ControllerNode::enableAndAcquireController (ControllerNode *controller) noexcept=0
enable() 使能本节点并让 controller 取得其控制权,由与父节点驱动。 已经使能、但不是 Standalone 也没有其他控制者的节点只被借用一次,不重建其子树;本轮内新 使能的节点先推进候选子节点,再执行自身使能、保护与状态提交。
IController/IController.hpp:194isControlled
bool core::control::ControllerNode::isControlled () const noexcept
上游未提供说明。
IController/IController.hpp:108isEnabled
bool core::control::ControllerNode::isEnabled () const noexcept
上游未提供说明。
IController/IController.hpp:105isProtected
bool core::control::ControllerNode::isProtected () const noexcept
上游未提供说明。
IController/IController.hpp:107isStandalone
bool core::control::ControllerNode::isStandalone () const noexcept
上游未提供说明。
IController/IController.hpp:106lastEnableState
virtual bool core::control::ControllerNode::lastEnableState () const noexcept=0
本轮开始前节点是否已使能;仅供本轮回滚判断。
IController/IController.hpp:205lockDisableUpstream
virtual bool core::control::ControllerNode::lockDisableUpstream (ControllerNode *lockedChild, ControllerNode *&root) noexcept=0
本节点已锁定:锁住祖先及各层剩余子树,返回根节点;失败只保留本节点的锁。
IController/IController.hpp:212lockTree
virtual bool core::control::ControllerNode::lockTree () noexcept=0
锁住自身候选子树;失败时释放本轮已经取得的节点锁。
IController/IController.hpp:207operator=
ControllerNode & core::control::ControllerNode::operator= (ControllerNode &&)=delete
上游未提供说明。
IController/IController.hpp:58operator=
ControllerNode & core::control::ControllerNode::operator= (const ControllerNode &)=delete
上游未提供说明。
IController/IController.hpp:56protect
virtual bool core::control::ControllerNode::protect () noexcept=0
仅 Standalone -> Protected;先提交自身保护行为,再改变状态。提交前发生竞争时不改变状态, 返回 false。
IController/IController.hpp:102releaseControllerWithoutCheckState
virtual void core::control::ControllerNode::releaseControllerWithoutCheckState (ControllerNode *controller) noexcept=0
释放 controller 通过 parent_ 对本节点持有的控制边。
IController/IController.hpp:224rollbackLastEnablement
virtual void core::control::ControllerNode::rollbackLastEnablement () noexcept=0
回滚本轮使能对本节点状态与控制权的改动。 本轮新使能的节点关闭自身并向下回滚;本轮借用的既有使能节点只释放本轮获得的控制权, 回到 Protected 并保留其原有子树。回滚可重复执行。
IController/IController.hpp:202selfDisable
virtual void core::control::ControllerNode::selfDisable ()
关闭本节点自身的资源,遵守上述共同重写约定。 正常失能及成功使能后的事务回滚都会调用;节点本就 Disabled 时也可能调用。 必须可重复执行且无资源累积,不能因逻辑状态显示未使能而省略必要的安全动作。 调用时本节点的 parent_ 已清除,state() 仍可能保留失能前的值;子节点由框架另行处理。 本钩子没有失败返回通道:返回前必须完成或可靠提交安全停机及自身资源清理,不能仅投递 可能丢失的请求便假定失能成功。使用异步 I/O 时,还必须取消或覆盖旧的使能/控制请求, 避免这些请求在失能后重新生效;不得等待完成中断或其他任务来解除当前持锁状态。
IController/IController.hpp:168selfEnable
virtual bool core::control::ControllerNode::selfEnable ()
使能本节点自身的资源,遵守上述共同重写约定。 selfProtect() 调用前,候选子节点已完成本轮使能及控制权取得;本节点的逻辑状态仍为 Disabled。 返回 true 后,框架才调用并提交本节点状态。已使能节点的幂等使能、 或借用既有已使能子树,不会再次调用本钩子。 selfDisable() 成功副作用必须能由安全撤销:后续祖先使能失败仍会回滚本节点。 必须支持失能后的再次使能及失败后的重试,不泄漏资源,不启动不可回滚的业务动作。 selfProtect() true 本节点的使能前置条件已满足,必要动作已完成或可靠提交,能够立即执行/selfDisable();不能依赖返回后才完成关键准备。 selfEnable() selfDisable() false 已自行撤销本次局部使能的全部副作用,回到安全的未使能状态。框架只回滚 子节点,不会为这次返回 false 的补调用。
IController/IController.hpp:155selfProtect
virtual void core::control::ControllerNode::selfProtect ()
建立本节点的安全保护输出,保持使能,遵守上述共同重写约定。 protect() state() 使能成功后、显式、控制权释放及借用节点的使能回滚都会调用。 调用时可能仍为 Disabled(刚完成 selfEnable)、Standalone 或 Controlled; parent_ 也可能尚未清除。不能要求已经进入 Protected 或已经没有控制者才执行保护。 必须可重复执行,以本节点定义的保持/制动等安全策略覆盖危险的旧输出,不失能本节点, 不破坏既有子树或自行释放控制权。本钩子没有失败返回通道,保护动作必须在返回前完成 或可靠提交,不能静默丢弃;框架随后才提交相应的状态/控制关系变更。
IController/IController.hpp:181standalone
virtual bool core::control::ControllerNode::standalone () noexcept=0
无控制者的 Protected -> Standalone;已 Standalone 时幂等。 只改变逻辑权限,不使能硬件、不提交业务命令。与在途的使能轮或其他节点变更竞争时返回 false,调用者可以稍后重试。
IController/IController.hpp:96state
State core::control::ControllerNode::state () const noexcept
上游未提供说明。
IController/IController.hpp:103unlockDisableUpstream
virtual void core::control::ControllerNode::unlockDisableUpstream (ControllerNode *lockedChild) noexcept=0
预锁回退:释放本节点、祖先及各层子树,但跳过尚由调用者持有的向下路径。
IController/IController.hpp:215unlockTree
virtual void core::control::ControllerNode::unlockTree () noexcept=0
沿不变的候选引用释放完整子树的锁,不依赖可能已被失能清除的 parent_。
IController/IController.hpp:209成员变量
3lock_flag_
AtomicFlagLock core::control::ControllerNode::lock_flag_
上游未提供说明。
IController/IController.hpp:234parent_
std::atomic<ControllerNode*> core::control::ControllerNode::parent_
上游未提供说明。
IController/IController.hpp:233state_
std::atomic<State> core::control::ControllerNode::state_
上游未提供说明。
IController/IController.hpp:232嵌套类型
1State
上游未提供说明。
Controlled- 上游未提供说明。
Disabled- 上游未提供说明。
Protected- 上游未提供说明。
Standalone- 上游未提供说明。