From e85485154d5df36041c185a8540f3c09a98f5937 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Mon, 12 Jul 2010 17:16:45 +0000 Subject: [PATCH] * Improved the thread pool logic so that we don't end up creating dozens of extra worker threads during shutdown --- webcit/context_loop.c | 17 +++++++++++++---- webcit/sysdep.c | 4 ++-- webcit/webcit.h | 2 ++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/webcit/context_loop.c b/webcit/context_loop.c index 7521207b2..8559f09b0 100644 --- a/webcit/context_loop.c +++ b/webcit/context_loop.c @@ -106,15 +106,24 @@ void do_housekeeping(void) session_destroy_modules(&sessions_to_kill); sessions_to_kill = sptr; } +} - /* - * Check the size of our thread pool. If all threads are executing, spawn another. - */ - begin_critical_section(S_SPAWNER); +/* + * Check the size of our thread pool. If all threads are executing, spawn another. + */ +void check_thread_pool_size(void) +{ + if (time_to_die) return; /* don't expand the thread pool during shutdown */ + + begin_critical_section(S_SPAWNER); /* only one of these should run at a time */ while ( (num_threads_executing >= num_threads_existing) && (num_threads_existing < MAX_WORKER_THREADS) ) { + lprintf(3, "%d of %d threads are executing. Adding another worker thread.\n", + num_threads_executing, + num_threads_existing + ); spawn_another_worker_thread(); } end_critical_section(S_SPAWNER); diff --git a/webcit/sysdep.c b/webcit/sysdep.c index fbe16ca0a..b3470a042 100644 --- a/webcit/sysdep.c +++ b/webcit/sysdep.c @@ -204,6 +204,8 @@ void worker_entry(void) } if (ssock < 0 ) continue; + check_thread_pool_size(); + /* Now do something. */ if (msock < 0) { if (ssock > 0) close (ssock); @@ -429,8 +431,6 @@ void spawn_another_worker_thread() pthread_attr_t attr; /* Thread attributes */ int ret; - lprintf(3, "Creating a new thread.\n"); - ++num_threads_existing; ++num_threads_executing; diff --git a/webcit/webcit.h b/webcit/webcit.h index 2f1e04873..1d632d476 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -822,6 +822,7 @@ void sleeeeeeeeeep(int); void http_transmit_thing(const char *content_type, int is_static); long unescape_input(char *buf); void do_selected_iconbar(void); +void check_thread_pool_size(void); void spawn_another_worker_thread(void); void StrEndTab(StrBuf *Target, int tabnum, int num_tabs); void StrBeginTab(StrBuf *Target, int tabnum, int num_tabs); @@ -899,3 +900,4 @@ void http_datestring(char *buf, size_t n, time_t xtime); #define WC_TIMEFORMAT_AMPM 1 #define WC_TIMEFORMAT_24 2 +extern int time_to_die; /* Nonzero if server is shutting down */ -- 2.30.2