X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fthreads.c;h=0d3caed9f24043e5a46bef32238ad9b76e9c4494;hb=2c9048572f22002cd287cd3137b5f7461d35455b;hp=cb216febefa00d24a3339a419c103a46564dd358;hpb=ffa2f0d76075e6e404b050b340307affcf8cd79b;p=citadel.git diff --git a/citadel/threads.c b/citadel/threads.c index cb216febe..0d3caed9f 100644 --- a/citadel/threads.c +++ b/citadel/threads.c @@ -62,19 +62,8 @@ #include "event_client.h" -/* - * To create a thread you must call one of the create thread functions. - * You must pass it the address of (a pointer to a CtdlThreadNode initialised to NULL) like this - * struct CtdlThreadNode *node = NULL; - * pass in &node - * If the thread is created *node will point to the thread control structure for the created thread. - * If the thread creation fails *node remains NULL - * Do not free the memory pointed to by *node, it doesn't belong to you. - * This new interface duplicates much of the eCrash stuff. We should go for closer integration since that would - * remove the need for the calls to eCrashRegisterThread and friends - */ - -static int num_threads = 0; /* Current number of threads */ +int num_workers = 0; /* Current number of worker threads */ +int active_workers = 0; /* Number of ACTIVE worker threads */ pthread_key_t ThreadKey; pthread_mutex_t Critters[MAX_SEMAPHORES]; /* Things needing locking */ struct thread_tsd masterTSD; @@ -206,8 +195,6 @@ void CtdlThreadCreate(void *(*start_routine)(void*)) ret = pthread_attr_setstacksize(&attr, THREADSTACKSIZE); ret = pthread_create(&thread, &attr, CTC_backend, (void *)start_routine); if (ret != 0) syslog(LOG_EMERG, "pthread_create() : %s", strerror(errno)); - - ++num_threads; } @@ -231,20 +218,19 @@ void go_threading(void) CtdlThreadCreate(select_on_master); - /* FIXME temporary fixed size pool of worker threads */ - CtdlThreadCreate(worker_thread); - CtdlThreadCreate(worker_thread); - CtdlThreadCreate(worker_thread); + /* Begin with one worker thread. We will expand the pool if necessary */ CtdlThreadCreate(worker_thread); - CtdlThreadCreate(worker_thread); - CtdlThreadCreate(worker_thread); - CtdlThreadCreate(worker_thread); - CtdlThreadCreate(worker_thread); - - /* At this point I am a union worker and therefore serve no useful purpose. */ + /* The supervisor thread monitors worker threads and spawns more of them if it finds that + * they are all in use. FIXME make the 256 max threads a configurable value. + */ while(!CtdlThreadCheckStop()) { - sleep(3); + if ((active_workers == num_workers) && (num_workers < 256)) { + syslog(LOG_DEBUG, "worker threads: %d, active: %d\n", num_workers, active_workers); + CtdlThreadCreate(worker_thread); + syslog(LOG_DEBUG, "worker threads: %d, active: %d\n", num_workers, active_workers); + } + sleep(1); } /* Shut down */