diff --git a/src/include/private/switch_core_pvt.h b/src/include/private/switch_core_pvt.h index 40f51ba61a..137c129f27 100644 --- a/src/include/private/switch_core_pvt.h +++ b/src/include/private/switch_core_pvt.h @@ -285,6 +285,7 @@ struct switch_session_manager { int ready; int running; int busy; + int nuking; }; extern struct switch_session_manager session_manager; diff --git a/src/switch_core_session.c b/src/switch_core_session.c index cf7daaac16..449cd1c3c4 100644 --- a/src/switch_core_session.c +++ b/src/switch_core_session.c @@ -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; }