]> code.citadel.org Git - citadel.git/blobdiff - citadel/housekeeping.c
Clean up in housekeeping.c
[citadel.git] / citadel / housekeeping.c
index b0d4a1d265c93b1b977f3a1678224dc153864cd1..a883b8f64775a813bc20fa702996375a0f702344 100644 (file)
@@ -44,7 +44,7 @@
 #include "journaling.h"
 
 #include "ctdl_module.h"
-
+#include "threads.h"
 
 /*
  * Terminate idle sessions.  This function pounds through the session table
@@ -128,57 +128,46 @@ void check_ref_counts(void) {
 }      
 
 /*
- * This is the housekeeping loop.  Worker threads come through here after
- * processing client requests but before jumping back into the pool.  We
- * only allow housekeeping to execute once per minute, and we only allow one
- * instance to run at a time.
+ * This is the housekeeping thread. We
+ * only allow housekeeping to execute once per minute.
  */
-void do_housekeeping(void) {
-       static int housekeeping_in_progress = 0;
+void *do_housekeeping(void *args) {
        static time_t last_timer = 0L;
-       int do_housekeeping_now = 0;
        int do_perminute_housekeeping_now = 0;
        time_t now;
 
-       /*
-        * We do it this way instead of wrapping the whole loop in an
-        * S_HOUSEKEEPING critical section because it eliminates the need to
-        * potentially have multiple concurrent mutexes in progress.
-        */
-       begin_critical_section(S_HOUSEKEEPING);
-       if (housekeeping_in_progress == 0) {
-               do_housekeeping_now = 1;
-               housekeeping_in_progress = 1;
+       while (!CtdlThreadCheckStop())
+       {
+       CtdlThreadName("House keeping - sleeping");
+       CtdlThreadSleep(1);
+       
                now = time(NULL);
                if ( (now - last_timer) > (time_t)60 ) {
                        do_perminute_housekeeping_now = 1;
                        last_timer = time(NULL);
                }
-       }
-       end_critical_section(S_HOUSEKEEPING);
-
-       if (do_housekeeping_now == 0) {
-               return;
-       }
-
        /*
         * Ok, at this point we've made the decision to run the housekeeping
         * loop.  Everything below this point is real work.
         */
 
        /* First, do the "as often as needed" stuff... */
+       CtdlThreadName("House Keeping - Journal");
        JournalRunQueue();
 
+       CtdlThreadName("House Keeping - EVT_HOUSE");
        PerformSessionHooks(EVT_HOUSE); /* perform as needed housekeeping */
 
        /* Then, do the "once per minute" stuff... */
        if (do_perminute_housekeeping_now) {
+               do_perminute_housekeeping_now = 0;
                cdb_check_handles();                    /* suggested by Justin Case */
+               CtdlThreadName("House Keeping - EVT_TIMER");
                PerformSessionHooks(EVT_TIMER);         /* Run any timer hooks */
        }
-
+       }
        /*
         * All done.
         */
-       housekeeping_in_progress = 0;
+       return NULL;
 }