CONTEXT: add interlock with cleanup / attaching of sessions.
authorWilfried Goesgens <dothebart@citadel.org>
Tue, 29 Jan 2013 23:23:29 +0000 (00:23 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Tue, 29 Jan 2013 23:23:29 +0000 (00:23 +0100)
webcit/context_loop.c

index ff95e825ebe5ad428d604b610d8621ae6a6a327f..6fab115fad22bd156cf7779246561840d184de2b 100644 (file)
@@ -58,6 +58,7 @@ void do_housekeeping(void)
 {
        wcsession *sptr, *ss;
        wcsession *sessions_to_kill = NULL;
+       time_t the_time;
 
        /*
         * Lock the session list, moving any candidates for euthanasia into
@@ -65,9 +66,12 @@ void do_housekeeping(void)
         */
        CtdlLogResult(pthread_mutex_lock(&SessionListMutex));
        for (sptr = SessionList; sptr != NULL; sptr = sptr->next) {
-
+               if (the_time == 0)
+                       the_time = time(NULL);
                /* Kill idle sessions */
-               if ((time(NULL) - (sptr->lastreq)) > (time_t) WEBCIT_TIMEOUT) {
+               if ((sptr->inuse == 0) && 
+                   ((the_time - (sptr->lastreq)) > (time_t) WEBCIT_TIMEOUT))
+               {
                        syslog(3, "Timeout session %d", sptr->wc_session);
                        sptr->killthis = 1;
                }
@@ -560,7 +564,7 @@ void context_loop(ParsedHttpHdrs *Hdr)
        /*
         * If there were no qualifying sessions, then create a new one.
         */
-       if (TheSession == NULL) {
+       if ((TheSession == NULL) || (TheSession->killthis != 0)) {
                TheSession = CreateSession(1, 0, &SessionList, Hdr, &SessionListMutex);
        }