]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add proper shutdown to mod_conference
authorAnthony Minessale <anthony.minessale@gmail.com>
Tue, 15 Aug 2006 22:19:38 +0000 (22:19 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Tue, 15 Aug 2006 22:19:38 +0000 (22:19 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@2302 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/applications/mod_conference/mod_conference.c

index 5e7ccb8b45b397b01dbf9efc01c4ba774491ce83..3f61c5a9d3bb4e46951b8370c85510d1c830ace7 100644 (file)
@@ -53,6 +53,8 @@ static struct {
        switch_mutex_t *id_mutex;
        switch_mutex_t *hash_mutex;
        uint32_t id_pool;
+       int32_t running;
+       uint32_t threads;
 } globals;
 
 struct conference_member;
@@ -451,7 +453,9 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v
                return NULL;
        }
 
-       while(!switch_test_flag(conference, CFLAG_DESTRUCT)) {
+       globals.threads++;
+
+       while(globals.running && !switch_test_flag(conference, CFLAG_DESTRUCT)) {
                uint8_t file_frame[CONF_BUFFER_SIZE] = {0};
                switch_size_t file_sample_len = samples;
                switch_size_t file_data_len = samples * 2;
@@ -654,7 +658,8 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v
                        switch_core_destroy_memory_pool(&pool);
                }
        }
-       
+
+       globals.threads--;      
        return NULL;
 }
 
@@ -2908,6 +2913,22 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod
        /* Release the config registry handle */
        switch_xml_free(cxml);
 
+       globals.running = 1;
        /* indicate that the module should continue to be loaded */
        return status;
 }
+
+
+SWITCH_MOD_DECLARE(switch_status_t) switch_module_shutdown(void)
+{
+
+
+       if (globals.running) {
+               globals.running = 0;
+               while (globals.threads) {
+                       switch_yield(100000);
+               }
+       }
+
+       return SWITCH_STATUS_SUCCESS;
+}