源代码解读 [EOS 源码分析] 05 - nodeos 插件的生命周期

Admin · 2019年12月21日 · 21 次阅读
本帖已被设为精华帖!

EOS 源码分析系列文章,由技术作者松果撰写。为帮助更多开发者了解,特获授权转载至此。感谢松果兄支持。

img

上一篇文章介绍了nodeos插件之间的依赖关系,nodeos加载的所有插件都继承自appbase::plugin类,此类又继承自appbase::abstract_plugin类。这篇文章就从超类abstract_plugin着手分析nodeos插件的生命周期。

appbase::abstract_plugin

abstract_plugin类是nodeos所有插件的最终父类,是一个抽象类,定义在eos/libraries/appbase/include/appbase/plugin.hpp中的appbase命名空间下:

img

abstract_plugin定义了一个枚举变量state,用来表示插件当前在生命周期中所处的状态:

enum state {
  registered, ///< the plugin is constructed but doesn't do anything
  initialized, ///< the plugin has initialized any state required but is idle
  started, ///< the plugin is actively running
  stopped ///< the plugin is no longer running
};

有如下状态:

  • registered:插件已注册;

  • initialized:插件已初始化,所需的成员变量已初始化,但还处于空闲状态;

  • started:插件已启动,正在运行;

  • stopped:插件已停止运行。

abstract_plugin定义了一系列纯虚函数:

//析构函数
virtual ~abstract_plugin(){}
//获取当前状态
virtual state get_state()const = 0;
//获取插件名
virtual const std::string& name()const  = 0;
//设置插件配置选项
virtual void set_program_options( options_description& cli, options_description& cfg ) = 0;
//初始化插件
virtual void initialize(const variables_map& options) = 0;
//处理SIGHUP信号(在用户终端连接正常或非正常结束时发出)
virtual void handle_sighup() = 0;
//启动插件
virtual void startup() = 0;
//停止插件
virtual void shutdown() = 0;

以上函数中,initialize、startup、shutdown是插件的生命周期函数。

appbase::plugin

plugin类继承自abstract_plugin,定义在eos/libraries/appbase/include/appbase/application.hpp中的appbase命名空间下:

img

plugin类持有两个私有成员变量:

//状态,默认为已注册
state _state = abstract_plugin::registered;
//插件名
std::string _name;

plugin类还新增了一个register_dependencies函数,用于注册插件所依赖的插件,插件之间的依赖关系可以看上一篇文章。

plugin类实现了插件的生命周期函数initialize、startup、shutdown插件状态和生命周期函数的关系如下图:

img

这些函数的实现细节放到后续文章中进行介绍。

plugin类是一个类模板

template<typename Impl>
class plugin : public abstract_plugin {
  ...
}

子类继承plugin时,要设置模板参数,以chain_plugin为例:

class chain_plugin : public plugin<chain_plugin> {
  ...    
}

有一个继承自abstract_plugin类的函数,没有在plugin类中实现,而是放到了plugin的具体子类中实现,就是set_program_options,这个函数用于设置插件的配置项。以chain_plugin为例,定义如下(部分):

img

这些配置项可以在config.ini中进行配置,也可以在命令行进行配置。通过如下命令查询:

nodeos -h

img

更多内容

币圈信息站开发目录

EOS开发系列目录

共收到 0 条回复
Admin 将本帖设为了精华贴 12月21日 16:21
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册