]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
reloadxml
authorAnthony Minessale <anthony.minessale@gmail.com>
Fri, 26 May 2006 17:27:09 +0000 (17:27 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Fri, 26 May 2006 17:27:09 +0000 (17:27 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@1509 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/applications/mod_commands/mod_commands.c
src/switch_xml.c

index 2a0d5747d8db6a57e14f77531fe70bf6e4b3fe37..3cb543ef0e4db43071c4424f84df695ceaa5ccf7 100644 (file)
@@ -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 = {
index 34607728d808c7549a33ee23515195598bd21778..f9e210bd2bc211c783b2f785db8a5b2a260de6a3 100644 (file)
@@ -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) {