]> code.citadel.org Git - citadel.git/blobdiff - webcit/context_loop.c
Fixed a race condition which made the thread pool size unnecessarily large.
[citadel.git] / webcit / context_loop.c
index 7521207b21b67fa90469ad2f95ed01f0fe8c6d78..b506428b02387551563e337fdebb50da2dea5318 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);
-       while (
+/*
+ * 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 */
+       if (
                (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);