]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
declinatio mortuus obfirmo in fsctl hupall
authorAnthony Minessale <anthony.minessale@gmail.com>
Mon, 9 Mar 2009 22:51:31 +0000 (22:51 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Mon, 9 Mar 2009 22:51:31 +0000 (22:51 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@12544 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/switch_core_session.c

index 0e177b47c66103cede83acb23c5e7e654894185d..d400e1faa3ff0661d9362923364c3864ab7ed724 100644 (file)
@@ -81,6 +81,12 @@ SWITCH_DECLARE(void) switch_core_session_hupall_matching_var(const char *var_nam
        switch_hash_index_t *hi;
        void *val;
        switch_core_session_t *session;
+       switch_memory_pool_t *pool;
+       switch_queue_t *queue;
+       void *pop;
+       
+       switch_core_new_memory_pool(&pool);
+       switch_queue_create(&queue, 250000, pool);
 
        if (!var_val) return;
 
@@ -93,13 +99,25 @@ SWITCH_DECLARE(void) switch_core_session_hupall_matching_var(const char *var_nam
                        if (switch_core_session_read_lock(session) == SWITCH_STATUS_SUCCESS) {
                                if (switch_channel_up(session->channel) &&
                                        (this_val = switch_channel_get_variable(session->channel, var_name)) && (!strcmp(this_val, var_val))) {
-                                       switch_channel_hangup(session->channel, cause);
+                                       switch_queue_push(queue, switch_core_strdup(pool, session->uuid_str));
                                }
                                switch_core_session_rwunlock(session);
                        }
                }
        }
        switch_mutex_unlock(runtime.session_hash_mutex);
+
+       while(switch_queue_trypop(queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
+               char *uuid = (char *) pop;
+               
+               if ((session = switch_core_session_locate(uuid))) {
+                       switch_channel_hangup(session->channel, cause);
+                       switch_core_session_rwunlock(session);
+               }
+       }
+
+       switch_core_destroy_memory_pool(&pool);
+
 }      
 
 SWITCH_DECLARE(void) switch_core_session_hupall_endpoint(const switch_endpoint_interface_t *endpoint_interface, switch_call_cause_t cause)
@@ -107,6 +125,12 @@ SWITCH_DECLARE(void) switch_core_session_hupall_endpoint(const switch_endpoint_i
        switch_hash_index_t *hi;
        void *val;
        switch_core_session_t *session;
+       switch_memory_pool_t *pool;
+       switch_queue_t *queue;
+       void *pop;
+       
+       switch_core_new_memory_pool(&pool);
+       switch_queue_create(&queue, 250000, pool);
 
        switch_mutex_lock(runtime.session_hash_mutex);
        for (hi = switch_hash_first(NULL, session_manager.session_table); hi; hi = switch_hash_next(hi)) {
@@ -115,13 +139,25 @@ SWITCH_DECLARE(void) switch_core_session_hupall_endpoint(const switch_endpoint_i
                        session = (switch_core_session_t *) val;
                        if (switch_core_session_read_lock(session) == SWITCH_STATUS_SUCCESS) {
                                if (session->endpoint_interface == endpoint_interface) {
-                                       switch_channel_hangup(switch_core_session_get_channel(session), cause);
+                                       switch_queue_push(queue, switch_core_strdup(pool, session->uuid_str));
                                }
                                switch_core_session_rwunlock(session);
                        }
                }
        }
        switch_mutex_unlock(runtime.session_hash_mutex);
+
+       while(switch_queue_trypop(queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
+               char *uuid = (char *) pop;
+               
+               if ((session = switch_core_session_locate(uuid))) {
+                       switch_channel_hangup(session->channel, cause);
+                       switch_core_session_rwunlock(session);
+               }
+       }
+
+       switch_core_destroy_memory_pool(&pool);
+
 }      
 
 SWITCH_DECLARE(void) switch_core_session_hupall(switch_call_cause_t cause)
@@ -129,28 +165,37 @@ SWITCH_DECLARE(void) switch_core_session_hupall(switch_call_cause_t cause)
        switch_hash_index_t *hi;
        void *val;
        switch_core_session_t *session;
-       uint32_t loops = 0;
+       switch_memory_pool_t *pool;
+       switch_queue_t *queue;
+       void *pop;
        
-       while (session_manager.session_count > 0) {
-               switch_mutex_lock(runtime.session_hash_mutex);
-               for (hi = switch_hash_first(NULL, session_manager.session_table); hi; hi = switch_hash_next(hi)) {
-                       switch_hash_this(hi, NULL, NULL, &val);
-                       if (val) {
-                               session = (switch_core_session_t *) val;
-                               if (switch_core_session_read_lock(session) == SWITCH_STATUS_SUCCESS) {
-                                       switch_channel_hangup(switch_core_session_get_channel(session), cause);
-                                       switch_core_session_rwunlock(session);
-                               }
+       switch_core_new_memory_pool(&pool);
+       switch_queue_create(&queue, 250000, pool);
+
+       switch_mutex_lock(runtime.session_hash_mutex);
+       for (hi = switch_hash_first(NULL, session_manager.session_table); hi; hi = switch_hash_next(hi)) {
+               switch_hash_this(hi, NULL, NULL, &val);
+               if (val) {
+                       session = (switch_core_session_t *) val;
+                       if (switch_core_session_read_lock(session) == SWITCH_STATUS_SUCCESS) {
+                               switch_queue_push(queue, switch_core_strdup(pool, session->uuid_str));
+                               switch_core_session_rwunlock(session);
                        }
                }
-               switch_mutex_unlock(runtime.session_hash_mutex);
-               switch_yield(1000000);
-               if (++loops == 30) {
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Giving up with %d session%s remaining\n",
-                                                         session_manager.session_count, session_manager.session_count == 1 ? "" : "s");
-                       break;
+       }
+       switch_mutex_unlock(runtime.session_hash_mutex);
+       
+       while(switch_queue_trypop(queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
+               char *uuid = (char *) pop;
+               
+               if ((session = switch_core_session_locate(uuid))) {
+                       switch_channel_hangup(session->channel, cause);
+                       switch_core_session_rwunlock(session);
                }
        }
+
+       switch_core_destroy_memory_pool(&pool);
+       
 }