您的位置:首页 > 其它

(六)SDN 控制器 NOX 源码分析之—— Kernel

2015-06-15 13:51 197 查看
Kernel是用来管理所有组件的,它可以处理组件间的依赖关系,并且记录组件的安装,以供依赖需要,所以它是全局组件的container
接口:
Kernel::init(info_file, argc, argv)
初始化核心
Kernel :: get_instance()
Kernel是单例模式,全局只有一个对象存在,通过这个函数取得对象
void Kernel :: attach_deployer(Deployer*)
安装一个Kernel未知的组件时,需要为组件附加一个Deployer
Deployer_list Kernel :: get_deployers() const
得到部署器的列表
Component_context* Kernel :: get(const Component_name&) const
根据组件名字查询组件上下文实例
Component_context* Kernel :: get(const
Component_name&, const Component_state) const
用两个条件查询组件的上下文实例
Component_context_list Kernel :: get_all() const
得到所有组件上下文实例的列表
void Kernel :: install(const Component_name&, const Component_state) throw(state_change_error);
寻找一个需要安装此组件的deployer安装组件,并将组件的状态改到指定状态,如果组件已经安装,则抛出异常
void Kernel::install(Component_context* ctxt, const Component_state to)
安装新的组件到Kernel中,此方法被 Deployer :: deployer所调用,安装的状态为NOT_INSTALLED,而Deployer :: deployer被上面的同名重载方法install所调用
void Kernel::change(Component_context* ctxt, const Component_state to) throw(state_change_error)
改变组件的状态,组件对状态只能增大,不能变小。源码貌似有问题(kernel.cc第216句,我认为不该先改变它的状态)
void Kernel :: set_argument(const Component_name&, const Component_argument&)
添加想要安装的组件及参数
const Component_argument get_argument(const Component_name&) const
获得组件的参数
私有方法void Kernel::resolve()
Kernel试图解决依赖关系
私有方法bool Kernel :: resolve(const Component_state from, const Component_state to)
被上面的方法调用,解决conponent_context从状态from到to

成员变量的意义及意义:
typedef std::list<Component_context*> Component_context_list;
typedef std::list<Deployer*> Deployer_list;
typedef hash_map<Component_name, Component_context*> Component_name_context_map;
typedef hash_map<int, Component_context_list*> Component_state_context_set_map;
typedef hash_map<Component_name, Component_argument> Component_argument_map;
struct container_info
{
/* Universally Unique Identifier (UUID). Not 128-bits as defined
* in the RFC 4122, but 64-bits for the convenience. */
uint64_t uuid;

/* The number of times the container has been restarted. */
uint64_t restart_counter;
};

/* Deployers to try if a new component context needs to be created. */
Deployer_list deployers;
/* Every context */
Component_name_context_map contexts;
/* Application properties */
Component_argument_map arguments;
/* Set if a context required state has been changed while resolving. */
bool state_requirements_changed;
/* Set if the kernel is installing a component context right now. */
bool installing;
/* start time. used for uptime */
time_t start_time;
/* Persistent container information unique to this container instance.
* Retrieved and modified from/in a persistent storage in the
* beginning of the boot sequence. If nothing exists on the storage,
* the container creates a new info block with random UUID. */
container_info info;

(转载请注明出处:/article/8588340.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: