From 5cd583d7a2e97b49ea48cac8fc5874c18952d2ea Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Thu, 4 Aug 2016 20:11:29 -0500 Subject: res_pjsip: Cache global config options. We may check a global config option hundreds of times a second or more. Asking sorcery for the global configuration from the config files backend involves several allocations and container traversals. Using realtime without a memory cache is a lot worse because you have to lookup in the realtime database each time to reconstitute the sorcery object. With a memory cache for realtime, there is about the same amount of overhead as for config files. Either way, it is still fairly expensive to access the sorcery object that much. * Cache the global config options so we can access them faster. You must now always perform a res_pjsip reload to change the global options. Change-Id: Ice16c7a4cbca4614da344aaea21a072b86263ef7 --- res/res_pjsip/config_global.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) (limited to 'res') diff --git a/res/res_pjsip/config_global.c b/res/res_pjsip/config_global.c index 975c5eefe..1d0c11c35 100644 --- a/res/res_pjsip/config_global.c +++ b/res/res_pjsip/config_global.c @@ -48,6 +48,15 @@ #define DEFAULT_MWI_TPS_QUEUE_LOW -1 #define DEFAULT_MWI_DISABLE_INITIAL_UNSOLICITED 0 +/*! + * \brief Cached global config object + * + * \details + * Cached so we don't have to keep asking sorcery for the config. + * We could ask for it hundreds of times a second if not more. + */ +static AO2_GLOBAL_OBJ_STATIC(global_cfg); + static char default_useragent[256]; struct global_config { @@ -135,23 +144,14 @@ static int global_apply(const struct ast_sorcery *sorcery, void *obj) ast_sip_add_global_request_header("Max-Forwards", max_forwards, 1); ast_sip_add_global_request_header("User-Agent", cfg->useragent, 1); ast_sip_add_global_response_header("Server", cfg->useragent, 1); + + ao2_t_global_obj_replace_unref(global_cfg, cfg, "Applying global settings"); return 0; } static struct global_config *get_global_cfg(void) { - struct global_config *cfg; - struct ao2_container *globals; - - globals = ast_sorcery_retrieve_by_fields(ast_sip_get_sorcery(), "global", - AST_RETRIEVE_FLAG_MULTIPLE | AST_RETRIEVE_FLAG_ALL, NULL); - if (!globals) { - return NULL; - } - - cfg = ao2_find(globals, NULL, 0); - ao2_ref(globals, -1); - return cfg; + return ao2_global_obj_ref(global_cfg); } char *ast_sip_global_default_outbound_endpoint(void) @@ -462,6 +462,8 @@ int ast_sip_destroy_sorcery_global(void) ast_sorcery_instance_observer_remove(sorcery, &observer_callbacks_global); + ao2_t_global_obj_release(global_cfg, "Module is unloading"); + return 0; } -- cgit v1.2.3