Moved all threading code into threads.c
[citadel.git] / citadel / citserver.c
index 6eb838c4537b60f84925bea4a7c50d13e36ba2a9..e1b2135f7aec14d5cf1f14f82a13e727e8547fd5 100644 (file)
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#include <libcitadel.h>
 #include "citadel.h"
 #include "server.h"
 #include "sysdep_decls.h"
+#include "threads.h"
 #include "citserver.h"
 #include "config.h"
 #include "database.h"
 #include "file_ops.h"
 #include "policy.h"
 #include "control.h"
-#include "tools.h"
 #include "euidindex.h"
 
 #ifndef HAVE_SNPRINTF
 #include "snprintf.h"
 #endif
 
+#include "ctdl_module.h"
+
+
 struct CitContext *ContextList = NULL;
 struct CitContext* next_session = NULL;
 char *unique_session_numbers;
@@ -132,6 +136,10 @@ void master_startup(void) {
        lprintf(CTDL_INFO, "Opening databases\n");
        open_databases();
 
+       ctdl_thread_internal_init_tsd();
+       
+       CtdlThreadAllocTSD();
+       
        if (do_defrag) {
                defrag_databases();
        }
@@ -176,7 +184,6 @@ void master_startup(void) {
  */
 void master_cleanup(int exitcode) {
        struct CleanupFunctionHook *fcn;
-       struct MaintenanceThreadHook *m_fcn;
        static int already_cleaning_up = 0;
 
        if (already_cleaning_up) while(1) sleep(1);
@@ -190,19 +197,13 @@ void master_cleanup(int exitcode) {
        /* Close the AdjRefCount queue file */
        AdjRefCount(-1, 0);
 
-       for (m_fcn = MaintenanceThreadHookTable; m_fcn != NULL; m_fcn = m_fcn->next) {
-               lprintf(CTDL_INFO, "Waiting for maintenance thread \"%s\" to shut down\n", m_fcn->name);
-               pthread_join(m_fcn->MaintenanceThread_tid, NULL);
-       }
+       /* Do system-dependent stuff */
+       sysdep_master_cleanup();
        
-
        /* Close databases */
        lprintf(CTDL_INFO, "Closing databases\n");
        close_databases();
 
-       /* Do system-dependent stuff */
-       sysdep_master_cleanup();
-       
 #ifdef DEBUG_MEMORY_LEAKS
        dump_heap();
 #endif
@@ -300,7 +301,11 @@ void cmd_info(void) {
        }
 
        cprintf("%s\n", config.c_default_cal_zone);
-
+       /* Output load averages */
+       cprintf("%f\n", CtdlThreadLoadAvg);
+       cprintf("%f\n", CtdlThreadWorkerAvg);
+       cprintf("%d\n", CtdlThreadGetCount());
+       
        cprintf("000\n");
 }
 
@@ -824,9 +829,9 @@ void cmd_down(char *argbuf) {
        }
        else
        {
-               cprintf(Reply, CIT_OK);
+               cprintf(Reply, CIT_OK + SERVER_SHUTTING_DOWN);
        }
-       time_to_die = 1;
+       CtdlThreadStopAll();
 }
 
 /*
@@ -837,7 +842,7 @@ void cmd_halt(void) {
        if (CtdlAccessCheck(ac_aide)) return;
 
        cprintf("%d Halting server.  Goodbye.\n", CIT_OK);
-       time_to_die = 1;
+       CtdlThreadStopAll();
        shutdown_and_halt = 1;
 }
 
@@ -986,12 +991,16 @@ void citproto_begin_session() {
  */
 void do_command_loop(void) {
        char cmdbuf[SIZ];
-
+       char *old_name = NULL;
+       
+       old_name = CtdlThreadName("do_command_loop");
+       
        time(&CC->lastcmd);
        memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */
        if (client_getln(cmdbuf, sizeof cmdbuf) < 1) {
                lprintf(CTDL_ERR, "Client disconnected: ending session.\n");
                CC->kill_me = 1;
+               CtdlThreadName(old_name);
                return;
        }
 
@@ -1020,6 +1029,8 @@ void do_command_loop(void) {
                safestrncpy(CC->lastcmdname, cmdbuf, sizeof(CC->lastcmdname));
                time(&CC->lastidle);
        }
+       
+       CtdlThreadName(cmdbuf);
                
        if ((strncasecmp(cmdbuf, "ENT0", 4))
           && (strncasecmp(cmdbuf, "MESG", 4))
@@ -1391,6 +1402,7 @@ void do_command_loop(void) {
 
        /* Run any after-each-command routines registered by modules */
        PerformSessionHooks(EVT_CMD);
+       CtdlThreadName(old_name);
 }