* Improved the thread pool logic so that we don't end up creating dozens of extra...
authorArt Cancro <ajc@citadel.org>
Mon, 12 Jul 2010 17:16:45 +0000 (17:16 +0000)
committerArt Cancro <ajc@citadel.org>
Mon, 12 Jul 2010 17:16:45 +0000 (17:16 +0000)
webcit/context_loop.c
webcit/sysdep.c
webcit/webcit.h

index 7521207b21b67fa90469ad2f95ed01f0fe8c6d78..8559f09b02006b489f794ebe567d569a9124d1cb 100644 (file)
@@ -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);
index fbe16ca0ac61b574c5279d060eed5f40dcf26621..b3470a042c1362da057ef630d04f1a105ee5b70c 100644 (file)
@@ -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;
 
index 2f1e04873b5a7c616a8933fef35f9d718c6e6725..1d632d4763199a2ddedb14725e3d723198bd1530 100644 (file)
@@ -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 */