From 07a715928b1a991d8a6f93e65558bfd7ff143be8 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 28 Jun 2011 08:05:12 -0500 Subject: [PATCH] FS-2218 --resolve --- src/include/switch_types.h | 1 + src/include/switch_xml.h | 6 +++ src/switch_xml.c | 89 +++++++++++++++++++++++++++----------- 3 files changed, 70 insertions(+), 26 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index f4e589af2a..2f5646e54e 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -1813,6 +1813,7 @@ typedef switch_status_t (*switch_new_say_callback_t) (switch_say_file_handle_t * typedef struct switch_xml *switch_xml_t; typedef struct switch_core_time_duration switch_core_time_duration_t; +typedef switch_xml_t(*switch_xml_open_root_function_t) (uint8_t reload, const char **err, void *user_data); typedef switch_xml_t(*switch_xml_search_function_t) (const char *section, const char *tag_name, const char *key_name, const char *key_value, switch_event_t *params, void *user_data); diff --git a/src/include/switch_xml.h b/src/include/switch_xml.h index cf8da02870..6961b2da23 100644 --- a/src/include/switch_xml.h +++ b/src/include/switch_xml.h @@ -320,6 +320,12 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_insert(_In_ switch_xml_t xml, _In_ switc ///\brief removes a tag along with all its subtags #define switch_xml_remove(xml) switch_xml_free(switch_xml_cut(xml)) +///\brief set new core xml root +SWITCH_DECLARE(switch_status_t) switch_xml_set_root(switch_xml_t new_main); + +///\brief Set and alternate function for opening xml root +SWITCH_DECLARE(switch_status_t) switch_xml_set_open_root_function(switch_xml_open_root_function_t func, void *user_data); + ///\brief open the Core xml root ///\param reload if it's is already open close it and open it again as soon as permissable (blocking) ///\param err a pointer to set error strings diff --git a/src/switch_xml.c b/src/switch_xml.c index fa53406822..21ac2666f0 100644 --- a/src/switch_xml.c +++ b/src/switch_xml.c @@ -141,6 +141,11 @@ static switch_mutex_t *REFLOCK = NULL; static switch_mutex_t *FILE_LOCK = NULL; static switch_mutex_t *XML_GEN_LOCK = NULL; +SWITCH_DECLARE(switch_xml_t) __switch_xml_open_root(uint8_t reload, const char **err, void *user_data); + +static switch_xml_open_root_function_t XML_OPEN_ROOT_FUNCTION = (switch_xml_open_root_function_t)__switch_xml_open_root; +static void *XML_OPEN_ROOT_FUNCTION_USER_DATA = NULL; + static switch_hash_t *CACHE_HASH = NULL; struct xml_section_t { @@ -2046,14 +2051,67 @@ SWITCH_DECLARE(void) switch_xml_free_in_thread(switch_xml_t xml, int stacksize) static char not_so_threadsafe_error_buffer[256] = ""; -SWITCH_DECLARE(switch_xml_t) switch_xml_open_root(uint8_t reload, const char **err) +SWITCH_DECLARE(switch_status_t) switch_xml_set_root(switch_xml_t new_main) +{ + switch_xml_t old_root = NULL; + + switch_mutex_lock(REFLOCK); + + old_root = MAIN_XML_ROOT; + MAIN_XML_ROOT = new_main; + switch_set_flag(MAIN_XML_ROOT, SWITCH_XML_ROOT); + MAIN_XML_ROOT->refs++; + + if (old_root) { + if (old_root->refs) { + old_root->refs--; + } + + if (!old_root->refs) { + switch_xml_free(old_root); + } + } + + switch_mutex_unlock(REFLOCK); + + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_DECLARE(switch_status_t) switch_xml_set_open_root_function(switch_xml_open_root_function_t func, void *user_data) +{ + if (XML_LOCK) { + switch_mutex_lock(XML_LOCK); + } + + XML_OPEN_ROOT_FUNCTION = func; + XML_OPEN_ROOT_FUNCTION_USER_DATA = user_data; + + if (XML_LOCK) { + switch_mutex_unlock(XML_LOCK); + } + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_DECLARE(switch_xml_t) switch_xml_open_root(uint8_t reload, const char **err) +{ + switch_xml_t root = NULL; + + switch_mutex_lock(XML_LOCK); + + if (XML_OPEN_ROOT_FUNCTION) { + root = XML_OPEN_ROOT_FUNCTION(reload, err, XML_OPEN_ROOT_FUNCTION_USER_DATA); + } + switch_mutex_unlock(XML_LOCK); + + return root; +} + +SWITCH_DECLARE(switch_xml_t) __switch_xml_open_root(uint8_t reload, const char **err, void *user_data) { char path_buf[1024]; uint8_t errcnt = 0; switch_xml_t new_main, r = NULL; - switch_mutex_lock(XML_LOCK); - if (MAIN_XML_ROOT) { if (!reload) { r = switch_xml_root(); @@ -2071,27 +2129,8 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_open_root(uint8_t reload, const char **e new_main = NULL; errcnt++; } else { - switch_xml_t old_root; *err = "Success"; - - switch_mutex_lock(REFLOCK); - - old_root = MAIN_XML_ROOT; - MAIN_XML_ROOT = new_main; - switch_set_flag(MAIN_XML_ROOT, SWITCH_XML_ROOT); - MAIN_XML_ROOT->refs++; - - if (old_root) { - if (old_root->refs) { - old_root->refs--; - } - - if (!old_root->refs) { - switch_xml_free(old_root); - } - } - - switch_mutex_unlock(REFLOCK); + switch_xml_set_root(new_main); } } else { @@ -2109,9 +2148,7 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_open_root(uint8_t reload, const char **e r = switch_xml_root(); } - done: - - switch_mutex_unlock(XML_LOCK); + done: return r; }