欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Ganglia python扩展 - mod_python.c源码分析(1)

程序员文章站 2022-04-17 20:50:18
...
本文参考Ganglia 3.7.2版本代码完成。
 
代码一开始就定义了2个指向NULL的数组指针metric_info和metric_mapping_info,这是两个全局变量,其值在metric_init中初始化(metric_init函数metric字典解析后存入这两个数组),然后在call back函数中展开,这样就完成了2个函数之间数据传递。
 
 
函数解读:
一.   static char* is_python_module(const char* fname)
传入文件名,检检文件中是否有"."符号和是否以.py结尾,返回.py前面部分,否则返回NULL
 
二.   int get_pydict_callable_value(PyObject* pdict, char* key, PyObject** pobj)
查找pdict字典对象的keys中是否存在key这个元素,取出这个元素的值并赋给指标pobj。这个函数是用来取出call back定义的函数。
 
三.   static void fill_metric_info(PyObject* pdict, py_metric_init_t* minfo, char *modname, apr_pool_t *pool)
传入modname和metric_init函数返回的metric字典pdict,循环解析pdict的key,并把key对应的 value 存入结构 minfo中(minfo为py_metric_init_t结构)
 
四.   static void fill_gmi(Ganglia_25metric* gmi, py_metric_init_t* minfo)
把结构 minfo 里的参数及值复制到结构 gmi 中,gmi结构比minfo结构多了2个类型,int key和 int msg_size。gmi->key 会自动地赋值给gmond。gmi应该是gmond可以识别的结构变量。
 
五.   static cfg_t*  find_module_config(char *modname)
查找指定module的配置信息。
 
函数处理过程:
(1).  查找到modules
(2).  查找到modules下的module,对所有module(用cfg_t类型的指针pymodule指向当前module配置)依次循环,返回符合以下条件的pymodule对像
(1).  查找module下的language值,判断是否为"python"(其中"python"不区分大小写,程序中用的都是小写),找不到或者不符合条件则continue到下一个module
(2).  查找module下的name,判断与传入的模块名称(char *modname)与此处配置的名称是否一致,不匹配时continue到下一个module
(3).  查找module下的enabled,判断是该module是否为有效状态(enabled = 1为有效,enabled = 0为无效), 无效时continue到下一个module
(4).  以上条件都满足时立即退出并返回pymodule对象
(3).  循环结束,返回NULL(没有找到满足的module
 
 
六.   static PyObject* build_params_dict(cfg_t *pymodule)
构造param字典
 
(1)把pymodule对象传入函数,找到pymodule下面所有的param,并依次循环
1)  找到param对应的name和value
2)  把value转换为string类型
3)  当name和value同时为真时,将其写入params_dict字典中对象
(2)循环结束,返回params_dict字典对象