Ceph学习记录5-Peering机制

参考:Ceph源码分析(常涛)


1.statechart

在statechart里,一个状态定义的方式有两种:没有子状态情况下的定义和有子状态下的定义。

没有子状态情况下的定义:

struct Reset : boost::statechart::state< Reset, RecoveryMachine >

这里定义了状态Reset,它需要继承类boost::statechart::state类。该类的模板参数中,第一个参数为状态自己的名字Reset,第二个参数为该状态所属状态机的名字,表明Reset是状态机RecoveryMachine的一个状态。

有子状态情况下的状态定义:

strcut Started : boost::statechart::struct< Started, RecoveryMachine, Start >

状态Started也是状态机RecoveryMachine的一个状态,模板参数中多一个参数Start,它是状态Started的默认初始子状态,其定义如下:

struct Start : boost::statechart::state< Start, Started >

这里的Start是状态Started的子状态。第一个模板参数是自己的名字,第二个模板参数是该子状态所属父状态的名字。

扫描二维码关注公众号,回复: 3742896 查看本文章

综上:一个状态,要么属于一个状态机,要么属于一个状态,成为该状态的子状态。其定义的模板参数,第一个参数是自己,第二个是拥有者,第三个参数是它的起始子状态。

2. 事件

状态能够接收并处理事件。事件可以改变状态,促使状态发生转移。在boost库的statechart状态机中定义事件的方式如下:

struct QueryStaet : boost::statechart::event< QueryState >

3.context函数

context在状态机中,可以获取当前状态的所有祖先状态的指针。通过它可以获取父状态以及祖先状态的一些内部参数和状态值。

例如:Start是RecoveryMachine的一个状态,状态Started是Start状态的一个子状态,那么如果当前状态是Started,就可以通过该函数获取它的父状态Start的指针:

Start * parent = context<Start>()

同时,也可以获取其祖先状态RecoveryMachine的指针:

RecoveringMachine * grandparent = context<RecoveryMachine>()

4. 事件的特殊处理

transit:直接跳转到目标状态

post_event:直接产生相应的事件,并投递给状态机

discard_event:直接丢弃事件,不做任何处理

forward_event:把当前事件继续投递给状态机

猜你喜欢

转载自blog.csdn.net/qq_20283969/article/details/82078623
今日推荐