X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fthreads.c;h=18641b5456491ce4201069b5cd55a64e6403b19c;hb=fd710adc44e642ad7b62cffbb7114c5b3f82bed4;hp=2f5f8d68222e6f00aa890b22fc4f3165f2c01234;hpb=655de5af64c89584fbdd0110a27053a9f3bfd138;p=citadel.git diff --git a/citadel/threads.c b/citadel/threads.c index 2f5f8d682..18641b545 100644 --- a/citadel/threads.c +++ b/citadel/threads.c @@ -1,7 +1,7 @@ /* * Thread handling stuff for Citadel server * - * Copyright (c) 1987-2011 by the citadel.org team + * Copyright (c) 1987-2019 by the citadel.org team * * This program is open source software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 3. @@ -19,19 +19,17 @@ #include "modules_init.h" #include "serv_extensions.h" #include "ctdl_module.h" +#include "config.h" #include "context.h" #include "threads.h" - 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; int server_shutting_down = 0; /* set to nonzero during shutdown */ - -pthread_mutex_t ThreadCountMutex;; - +pthread_mutex_t ThreadCountMutex; void InitializeSemaphores(void) { @@ -44,8 +42,6 @@ void InitializeSemaphores(void) } - - /* * Obtain a semaphore lock to begin a critical section. * but only if no one else has one @@ -57,7 +53,6 @@ int try_critical_section(int which_one) * transaction; this could lead to deadlock. */ if ( (which_one != S_FLOORCACHE) - && (which_one != S_RPLIST) ) { cdb_check_handles(); } @@ -75,13 +70,13 @@ void begin_critical_section(int which_one) * transaction; this could lead to deadlock. */ if ( (which_one != S_FLOORCACHE) - && (which_one != S_RPLIST) ) { cdb_check_handles(); } pthread_mutex_lock(&Critters[which_one]); } + /* * Release a semaphore lock to end a critical section. */ @@ -91,18 +86,18 @@ void end_critical_section(int which_one) } - - /* * Return a pointer to our thread-specific (not session-specific) data. */ struct thread_tsd *MyThread(void) { - register struct thread_tsd *c; - return ((c = (struct thread_tsd *) pthread_getspecific(ThreadKey), c == NULL) ? &masterTSD : c); + struct thread_tsd *c = (struct thread_tsd *) pthread_getspecific(ThreadKey) ; + if (!c) { + return &masterTSD; + } + return c; } - /* * Called by CtdlThreadCreate() * We have to pass through here before starting our thread in order to create a set of data @@ -118,8 +113,7 @@ void *CTC_backend(void *supplied_start_routine) pthread_setspecific(ThreadKey, (const void *) mytsd); start_routine(NULL); - - free(mytsd); + // free(mytsd); return(NULL); } @@ -133,11 +127,10 @@ void CtdlThreadCreate(void *(*start_routine)(void*)) pthread_attr_t attr; int ret = 0; - ret = pthread_attr_init(&attr); 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)); + if (ret != 0) syslog(LOG_ERR, "pthread_create() : %m"); } @@ -145,20 +138,12 @@ void InitializeMasterTSD(void) { memset(&masterTSD, 0, sizeof(struct thread_tsd)); } -extern void ShutDownEventQueues(void); -int EventQShuttingDown = 0; -int EVQShutDown = 0; /* * Initialize the thread system */ void go_threading(void) { - if (pthread_key_create(&ThreadKey, NULL) != 0) { - syslog(LOG_EMERG, "pthread_key_create() : %s", strerror(errno)); - abort(); - } - pthread_mutex_init(&ThreadCountMutex, NULL); /* Second call to module init functions now that threading is up */ @@ -171,22 +156,13 @@ void go_threading(void) * they are all in use. */ while (!server_shutting_down) { - if ((active_workers == num_workers) && (num_workers < config.c_max_workers)) { + if ((active_workers == num_workers) && (num_workers < CtdlGetConfigInt("c_max_workers"))) { CtdlThreadCreate(worker_thread); } usleep(1000000); } /* When we get to this point we are getting ready to shut down our Citadel server */ - if (!EventQShuttingDown) - { - EventQShuttingDown = 1; - ShutDownEventQueues(); - } - while (!EVQShutDown) - usleep(1000000); - - terminate_all_sessions(); /* close all client sockets */ CtdlShutdownServiceHooks(); /* close all listener sockets to prevent new connections */ PerformSessionHooks(EVT_SHUTDOWN); /* run any registered shutdown hooks */