]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
thread pool was not releasing surplus threads after timeout
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 15 Nov 2012 00:43:22 +0000 (18:43 -0600)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 15 Nov 2012 00:43:28 +0000 (18:43 -0600)
src/include/private/switch_core_pvt.h
src/switch_core_session.c

index 40f51ba61a01318777832d03c6b98a69fe542de2..137c129f27864e4173355e47d74547531d27b07d 100644 (file)
@@ -285,6 +285,7 @@ struct switch_session_manager {
        int ready;
        int running;
        int busy;
+       int nuking;
 };
 
 extern struct switch_session_manager session_manager;
index cf7daaac1603dfc5d96d50ba2ecc7721b3bdef24..449cd1c3c4d5ec8865e2cdb646f59e4cf4105adf 100644 (file)
@@ -1530,13 +1530,15 @@ static void *SWITCH_THREAD_FUNC switch_core_session_thread_pool_worker(switch_th
        while(session_manager.ready) {
                switch_status_t check_status;
 
+               pop = NULL;
+
                if (check) {
                        check_status = switch_queue_trypop(session_manager.thread_queue, &pop);
                } else {
                        check_status = switch_queue_pop(session_manager.thread_queue, &pop);
                }
 
-               if (check_status == SWITCH_STATUS_SUCCESS) {
+               if (check_status == SWITCH_STATUS_SUCCESS && pop) {
                        switch_thread_data_t *td = (switch_thread_data_t *) pop;
                        
                        if (!td) break;
@@ -1609,12 +1611,11 @@ static switch_status_t check_queue(void)
        int x = 0;
 
        switch_mutex_lock(session_manager.mutex);
-       ttl = switch_queue_size(session_manager.thread_queue);
+       ttl = switch_queue_size(session_manager.thread_queue) - session_manager.nuking;
        x = (session_manager.running - session_manager.busy);
        switch_mutex_unlock(session_manager.mutex);
 
 
-
        while (x < ttl) {
                switch_thread_t *thread;
                switch_threadattr_t *thd_attr;
@@ -1653,13 +1654,26 @@ static void *SWITCH_THREAD_FUNC switch_core_session_thread_pool_manager(switch_t
                switch_yield(100000);
 
                if (++x == 300) {
-                       switch_queue_interrupt_all(session_manager.thread_queue);
-                       x = 0;
+                       switch_mutex_lock(session_manager.mutex);
+                       session_manager.nuking = (session_manager.running - session_manager.busy);
+                       switch_mutex_unlock(session_manager.mutex);
+
+                       if (session_manager.nuking) {
+                               int i = 0;
+
+                               for (i = 0; i < session_manager.nuking; i++) {
+                                       switch_queue_push(session_manager.thread_queue, NULL);
+                               }
+                               
+                               x--;
+                       } else {
+                               x = 0;
+                       }
                }
 
                check_queue();
        }
-
+       
        return NULL;
 }