diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index 2a0d5747d8..3cb543ef0e 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -80,6 +80,20 @@ static switch_status_t load_function(char *mod, switch_stream_handle_t *stream) return SWITCH_STATUS_SUCCESS; } + +static switch_status_t reload_function(char *mod, switch_stream_handle_t *stream) +{ + const char *err; + switch_xml_t xml_root; + + if ((xml_root = switch_xml_open_root(1, &err))) { + switch_xml_free(xml_root); + } + + stream->write_function(stream, "OK [%s]\n", err); + return SWITCH_STATUS_SUCCESS; +} + static switch_status_t kill_function(char *dest, switch_stream_handle_t *stream) { switch_core_session_t *session = NULL; @@ -231,12 +245,19 @@ static switch_api_interface_t load_api_interface = { /*.next */ &transfer_api_interface }; +static switch_api_interface_t reload_api_interface = { + /*.interface_name */ "reloadxml", + /*.desc */ "Reload XML", + /*.function */ reload_function, + /*.next */ &load_api_interface, + +}; static switch_api_interface_t commands_api_interface = { /*.interface_name */ "killchan", /*.desc */ "Kill Channel", /*.function */ kill_function, - /*.next */ &load_api_interface + /*.next */ &reload_api_interface }; static const switch_loadable_module_interface_t mod_commands_module_interface = { diff --git a/src/switch_xml.c b/src/switch_xml.c index 34607728d8..f9e210bd2b 100644 --- a/src/switch_xml.c +++ b/src/switch_xml.c @@ -94,6 +94,7 @@ static switch_xml_t MAIN_XML_ROOT = NULL; static switch_memory_pool_t *XML_MEMORY_POOL; static switch_mutex_t *XML_LOCK; static switch_thread_rwlock_t *RWLOCK; +static uint32_t lock_count = 0; struct xml_section_t { const char *name; @@ -844,7 +845,7 @@ SWITCH_DECLARE(switch_status_t) switch_xml_locate(char *section, for(;;) { if (!xml) { - if (!(xml = MAIN_XML_ROOT)) { + if (!(xml = switch_xml_root())) { *node = NULL; *root = NULL; return SWITCH_STATUS_FALSE; @@ -870,8 +871,10 @@ SWITCH_DECLARE(switch_status_t) switch_xml_locate(char *section, return SWITCH_STATUS_FALSE; } + SWITCH_DECLARE(switch_xml_t) switch_xml_root(void) { + lock_count++; switch_thread_rwlock_rdlock(RWLOCK); return MAIN_XML_ROOT; } @@ -880,7 +883,7 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_open_root(uint8_t reload, const char **e { char path_buf[1024]; uint8_t hasmain = 0; - + switch_mutex_lock(XML_LOCK); if (MAIN_XML_ROOT) { @@ -905,6 +908,7 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_open_root(uint8_t reload, const char **e switch_xml_free(MAIN_XML_ROOT); MAIN_XML_ROOT = NULL; } else { + *err = "Success"; switch_set_flag(MAIN_XML_ROOT, SWITCH_XML_ROOT); } } else { @@ -915,6 +919,7 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_open_root(uint8_t reload, const char **e switch_thread_rwlock_unlock(RWLOCK); } switch_mutex_unlock(XML_LOCK); + return switch_xml_root(); } @@ -1100,7 +1105,10 @@ SWITCH_DECLARE(void) switch_xml_free(switch_xml_t xml) if (! xml ) return; if (switch_test_flag(xml, SWITCH_XML_ROOT)) { - switch_thread_rwlock_unlock(RWLOCK); + if (lock_count > 0) { + switch_thread_rwlock_unlock(RWLOCK); + lock_count--; + } } if (xml == MAIN_XML_ROOT) {