Mysql源代码分析(5): Plugin架构介绍
时间:2009-02-28 来源:li.liu
Mysql源代码分析(5): Plugin架构介绍
Mysql现在很多模块都是通过plugin的方式连接到Mysql核心中的,除了大家熟悉的存储引擎都是Plugin之外,Mysql还支持其他类型的plugin。本文将对相关内容做一些简单介绍。主要还是以架构性的介绍为主,具体细节会提到一点,但是肯定不会包括所有的细节。
主要数据结构和定义
大部分的数据接口,宏和常量都定义在include/mysql/plugin.h中,我们来慢慢看。
先看plugin的类型:
在见面的介绍main函数的文章中我也提到了其中有个函数plugin_init()是初始化的一部分,这个东东就是所有静态链接初始化plugin的初始化入口。该函数定义在"sql/sql_plugin.cc"中。
int plugin_init(int *argc, char **argv, int flags) {
// 初始化内存分配pool。
init_alloc_root(&plugin_mem_root, 4096, 4096);
init_alloc_root(&tmp_root, 4096, 4096);
// hash结构初始化
...
// 初始化运行时plugin数组,plugin_dl_array用来保存动态加载plugin,plugin_array保存静态链接plugin。而且最多各自能有16个plugin。
my_init_dynamic_array(&plugin_dl_array, sizeof(struct st_plugin_dl *),16,16);
}
这个函数执行结束以后,在plugin_array,plugin_dl_array,plugin_hash中保存了当前加载了的所有的plugin。到此plugin初始化结束。
在plugin_initialize函数里面,调用了每个plugin自己的init函数(参见前面的内容)。特别要提到的是对于各种不同类型的plugin,初始化函数的参数也不一样,这是通过一个全局的plugin_type_initialize间接层来实现的。这个数组对于每种类型的plugin定义了一个函数,比如对于storage plugin对应的是ha_initialize_handlerton,对于information scheme对应的是initialize_schema_table,然后在这些函数中再调用plugin的初始化函数。暂时对于其他类型的plugin没有定义这个中间层初始化函数,所以就直接调用了plugin的初始化函数。