res_config_mysql和chan_sip模块的加载分析
1. res_config_mysql的模塊加載早于chan_sip,他們的加載函數均為load_module
??? 先分析res_config_mysql的load_module函數
????
??? parse_config(0);
???parse_config解析res_config_mysql文件,并用文件中的配置信息填充mysql_conn結構體
???? 我當前的res_config_mysql文件如下
??? [general]
??? dbhost = 192.168.1.182
??? dbname = asterisk
??? dbuser = root
??? dbpass = 123456
??? dbport = 3306
???? 解析完成后,mysql_conn里面會得到這些數據struct mysql_conn {
?? ?AST_RWLIST_ENTRY(mysql_conn) list;
?? ?ast_mutex_t?? ?lock;
?? ?MYSQL?????? handle;
?? ?char??????? host[50];??????????????? 192.168.1.182
?? ?char??????? name[50];????????????? asterisk
?? ?char??????? user[50];??????????????? root
?? ?char??????? pass[50];?????????????? 123456
?? ?char??????? sock[50];
?? ?char??????? charset[50];
?? ?int???????? port;???????????????????????? 3306
?? ?int???????? connected;
?? ?time_t????? connect_time;
?? ?enum requirements requirements;
?? ?char??????? unique_name[0];
};
?? ?ast_config_engine_register(&mysql_engine);
??? 將res_config_mysql這個模塊的函數結構體注冊到
??? static struct ast_config_engine *config_engine_list;
實際res_config_mysql的load_module函數完成兩個事情,解析res_config_mysql.conf配置文件,并存儲。
然后向系統注冊res_config_mysql的功能函數
2. chan_sip模塊的加載
??? chan_sip模塊的加載也是load_module函數,在這個函數中我們主要關注reload_config函數
??? 在reload_config函數中調用
??? cfg = ast_config_load(config, config_flags);? config為sip.conf
???? 但是這里ast_config_load并不是直接加載sip.conf文件來生成一個ast_config結構體的。
??? 我們將其展開來分析,ast_config_load最終是調用了ast_config_internal_load
3. ast_config_internal_load分析
??? if (!ast_test_flag(&flags, CONFIG_FLAG_NOREALTIME) && config_engine_list) {
???????? flags是0,并且res_config_mysql模塊將其函數注冊到了config_engine_list中,因此if語句為真
??? ???? struct ast_config_engine *eng;
????? 從下面find_engine的分析,eng將得到res_config_mysql的ast_config_engine結構體
?? ??? ?eng = find_engine(filename, 1, db, sizeof(db), table, sizeof(table));
?? ??? ?if (eng && eng->load_func) {
?? ??? ??? ?loader = eng;
?? ??? ?} else {
?? ??? ??? ?eng = find_engine("global", 1, db, sizeof(db), table, sizeof(table));
?? ??? ??? ?if (eng && eng->load_func)
?? ??? ??? ??? ?loader = eng;
?? ??? ?}
?? ?}
???????? 最后調用了res_config_mysql的oad_func函數,即config_mysql函數
???? ??? result = loader->load_func(db, table, filename, cfg, flags, suggested_include_file, who_asked);
4. find_engine分析
?? find_engine展開解釋,在extconfig.conf被解析后,config_maps里面如下
?? name = extensions??dirver =mysql?? database =general??? table =extensions
?? name = sip.conf?????? dirver =mysql?? database =general??? table =sip_config2
????? for (map = config_maps; map; map = map->next) {
??????? family為"sip.conf",因此,for結束后,database = general, table = sip_config2
??? ???? if (!strcasecmp(family, map->name) && (priority == map->priority)) {
?? ??? ??? ?if (database)
?? ??? ??? ??? ?ast_copy_string(database, map->database, dbsiz);
?? ??? ??? ?if (table)
?? ??? ??? ??? ?ast_copy_string(table, map->table ? map->table : family, tabsiz);
?? ??? ??? ?break;
?? ??? ?}
?? ?}
?? ?/* Check if the required driver (engine) exist */
?? ?if (map) {
???? 從res_config_mysql看他的ast_config_engine的定義里面,其name為mysql,從上面看map的driver也是mysql,
??? 因此 find_engine這個函數最后返回了res_config_mysql這個ast_config_engine
?? ???? for (eng = config_engine_list; !ret && eng; eng = eng->next) {
?? ??? ??? ?if (!strcasecmp(eng->name, map->driver))
?? ??? ??? ??? ?ret = eng;
?? ??? ?}
?? ?}
???
總結
以上是生活随笔為你收集整理的res_config_mysql和chan_sip模块的加载分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 库存告急!海外动力煤价格飞涨:高电价今夏
- 下一篇: am335x uart5配置