]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
finish fixing thread pool logic from yesterday
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 15 Nov 2012 23:59:11 +0000 (17:59 -0600)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 15 Nov 2012 23:59:11 +0000 (17:59 -0600)
src/include/private/switch_core_pvt.h
src/switch_core_session.c

index 137c129f27864e4173355e47d74547531d27b07d..7bdf1e3dd065e78389fd8496437eb5d299f3d50e 100644 (file)
@@ -285,7 +285,7 @@ struct switch_session_manager {
        int ready;
        int running;
        int busy;
-       int nuking;
+       int popping;
 };
 
 extern struct switch_session_manager session_manager;
index eb250b8dead51b772f5eef35d71dcb74e2c57663..e1093c50f38ee8635b595eed1024a284799bcc01 100644 (file)
@@ -1540,7 +1540,15 @@ static void *SWITCH_THREAD_FUNC switch_core_session_thread_pool_worker(switch_th
                if (check) {
                        check_status = switch_queue_trypop(session_manager.thread_queue, &pop);
                } else {
+                       switch_mutex_lock(session_manager.mutex);
+                       session_manager.popping++;
+                       switch_mutex_unlock(session_manager.mutex);
+                       
                        check_status = switch_queue_pop(session_manager.thread_queue, &pop);
+
+                       switch_mutex_lock(session_manager.mutex);
+                       session_manager.popping--;
+                       switch_mutex_unlock(session_manager.mutex);
                }
 
                if (check_status == SWITCH_STATUS_SUCCESS && pop) {
@@ -1616,7 +1624,7 @@ static switch_status_t check_queue(void)
        int x = 0;
 
        switch_mutex_lock(session_manager.mutex);
-       ttl = switch_queue_size(session_manager.thread_queue) - session_manager.nuking;
+       ttl = switch_queue_size(session_manager.thread_queue);
        x = (session_manager.running - session_manager.busy);
        switch_mutex_unlock(session_manager.mutex);
 
@@ -1659,18 +1667,24 @@ static void *SWITCH_THREAD_FUNC switch_core_session_thread_pool_manager(switch_t
                switch_yield(100000);
 
                if (++x == 300) {
-                       switch_mutex_lock(session_manager.mutex);
-                       session_manager.nuking = (session_manager.running - session_manager.busy);
-                       switch_mutex_unlock(session_manager.mutex);
+                       if (session_manager.popping) {
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, 
+                                                                 "Thread pool: running:%d busy:%d popping:%d\n", session_manager.running, session_manager.busy, session_manager.popping);
+
+                               if (session_manager.popping) {
+                                       int i = 0;
 
-                       if (session_manager.nuking) {
-                               int i = 0;
+                                       switch_mutex_lock(session_manager.mutex);
+                                       for (i = 0; i < session_manager.popping; i++) {
+                                               switch_queue_trypush(session_manager.thread_queue, NULL);
+                                       }
+                                       switch_mutex_unlock(session_manager.mutex);
 
-                               for (i = 0; i < session_manager.nuking; i++) {
-                                       switch_queue_push(session_manager.thread_queue, NULL);
                                }
-                               
+
                                x--;
+
+                               continue;
                        } else {
                                x = 0;
                        }