]> code.citadel.org Git - citadel.git/blobdiff - citadel/sysdep.c
* The size constant "256" which shows up everywhere as a buffer size has now
[citadel.git] / citadel / sysdep.c
index 083e3550ea7763076a3853d418aefb8ded7cfb27..a50bb0818fe0f7a9d3a8c561f0439d536aafb425 100644 (file)
@@ -7,8 +7,8 @@
  * Here's where we (hopefully) have most parts of the Citadel server that
  * would need to be altered to run the server in a non-POSIX environment.
  * 
- * Eventually we'll try porting to a different platform and either have
- * multiple variants of this file or simply load it up with #ifdefs.
+ * If we ever port to a different platform and either have multiple
+ * variants of this file or simply load it up with #ifdefs.
  *
  */
 
@@ -186,7 +186,7 @@ void dump_tracked() {
 
 
 /*
- * we used to use master_cleanup() as a signal handler to shut down the server.
+ * We used to use master_cleanup() as a signal handler to shut down the server.
  * however, master_cleanup() and the functions it calls do some things that
  * aren't such a good idea to do from a signal handler: acquiring mutexes,
  * playing with signal masks on BSDI systems, etc. so instead we install the
@@ -215,7 +215,8 @@ void init_sysdep(void) {
        /*
         * Set up a place to put thread-specific data.
         * We only need a single pointer per thread - it points to the
-        * thread's CitContext structure in the ContextList linked list.
+        * CitContext structure (in the ContextList linked list) of the
+        * session to which the calling thread is currently bound.
         */
        if (pthread_key_create(&MyConKey, NULL) != 0) {
                lprintf(1, "Can't create TSD key!!  %s\n", strerror(errno));
@@ -370,7 +371,11 @@ struct CitContext *MyContext(void) {
 
 
 /*
- * Initialize a new context and place it in the list.
+ * Initialize a new context and place it in the list.  The session number
+ * used to be the PID (which is why it's called cs_pid), but that was when we
+ * had one process per session.  Now we just assign them sequentially, starting
+ * at 1 (don't change it to 0 because masterCC uses 0) and re-using them when
+ * sessions terminate.
  */
 struct CitContext *CreateNewContext(void) {
        struct CitContext *me, *ptr;
@@ -456,7 +461,7 @@ void client_write(char *buf, int nbytes)
  */
 void cprintf(const char *format, ...) {   
         va_list arg_ptr;   
-        char buf[256];   
+        char buf[SIZ];   
    
         va_start(arg_ptr, format);   
         if (vsnprintf(buf, sizeof buf, format, arg_ptr) == -1)
@@ -563,8 +568,15 @@ void sysdep_master_cleanup(void) {
         */
        for (serviceptr = ServiceHookTable; serviceptr != NULL;
            serviceptr = serviceptr->next ) {
-               lprintf(3, "Closing listener on port %d\n",
-                       serviceptr->tcp_port);
+
+               if (serviceptr->tcp_port > 0)
+                       lprintf(3, "Closing listener on port %d\n",
+                               serviceptr->tcp_port);
+
+               if (serviceptr->sockpath != NULL)
+                       lprintf(3, "Closing listener on '%s'\n",
+                               serviceptr->sockpath);
+
                close(serviceptr->msock);
 
                /* If it's a Unix domain socket, remove the file. */
@@ -624,7 +636,7 @@ void cmd_nset(char *cmdbuf)
        FILE *netsetup;
        int ch;
        int a, b;
-       char netsetup_args[3][256];
+       char netsetup_args[3][SIZ];
 
        if (CC->usersupp.axlevel < 6) {
                cprintf("%d Higher access required.\n", 
@@ -792,6 +804,7 @@ void CtdlRedirectOutput(FILE *fp, int sock) {
 void InitializeMasterCC(void) {
        memset(&masterCC, 0, sizeof(struct CitContext));
        masterCC.internal_pgm = 1;
+       masterCC.cs_pid = 0;
 }
 
 
@@ -835,7 +848,7 @@ void init_master_fdset(void) {
  */
 int main(int argc, char **argv)
 {
-       pthread_t HousekeepingThread;   /* Thread descriptor */
+       pthread_t WorkerThread; /* Thread descriptor */
         pthread_attr_t attr;           /* Thread attributes */
        char tracefile[128];            /* Name of file to log traces to */
        int a, i;                       /* General-purpose variables */
@@ -914,6 +927,7 @@ int main(int argc, char **argv)
        lprintf(7, "Loading citadel.config\n");
        get_config();
 
+
        /*
         * Do non system dependent startup functions.
         */
@@ -979,33 +993,26 @@ int main(int argc, char **argv)
                }
        }
 
-       /*
-        * Create the housekeeper thread
-        */
-       lprintf(7, "Starting housekeeper thread\n");
-       pthread_attr_init(&attr);
-               pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-       if (pthread_create(&HousekeepingThread, &attr,
-          (void* (*)(void*)) housekeeping_loop, NULL) != 0) {
-               lprintf(1, "Can't create housekeeping thead: %s\n",
-                       strerror(errno));
-       }
-
-
+       /* We want to check for idle sessions once per minute */
+       CtdlRegisterSessionHook(terminate_idle_sessions, EVT_TIMER);
+       
        /*
         * Now create a bunch of worker threads.
         */
        for (i=0; i<(config.c_min_workers-1); ++i) {
+               lprintf(9, "Creating worker thread %d\n", i);
                pthread_attr_init(&attr);
                        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-               if (pthread_create(&HousekeepingThread, &attr,
+               if (pthread_create(&WorkerThread, &attr,
                   (void* (*)(void*)) worker_thread, NULL) != 0) {
                        lprintf(1, "Can't create worker thead: %s\n",
                        strerror(errno));
                }
        }
 
+
        /* Now this thread can become a worker as well. */
+       lprintf(9, "Original thread entering worker loop\n");
        worker_thread();
 
        return(0);
@@ -1182,6 +1189,8 @@ SETUP_FD: memcpy(&readfds, &masterfds, sizeof masterfds);
                        last_timer = time(NULL);
                        PerformSessionHooks(EVT_TIMER);
                }
+
+               check_sched_shutdown();
        }
 
        /* If control reaches this point, the server is shutting down */