]> code.citadel.org Git - citadel.git/blobdiff - citadel/housekeeping.c
* master_cleanup() now passes along an exit code from its caller to the OS.
[citadel.git] / citadel / housekeeping.c
index 09dbad4eb143aca6d3b3fb76b22dcb9706d6823c..9bb4624bb379271d056e8da9321dfcb7e42f4e8d 100644 (file)
@@ -72,15 +72,17 @@ void terminate_idle_sessions(void) {
                }
        }
        end_critical_section(S_SESSION_TABLE);
-       lprintf(9, "Terminated %d idle sessions\n", killed);
+       if (killed > 0)
+               lprintf(CTDL_INFO, "Terminated %d idle sessions\n", killed);
 }
 
 
 
 void check_sched_shutdown(void) {
        if ((ScheduledShutdown == 1) && (ContextList == NULL)) {
-               lprintf(3, "Scheduled shutdown initiating.\n");
+               lprintf(CTDL_NOTICE, "Scheduled shutdown initiating.\n");
                time_to_die = 1;
+               master_cleanup(0);
        }
 }
 
@@ -89,33 +91,43 @@ void check_sched_shutdown(void) {
 /*
  * Check (and fix) floor reference counts.  This doesn't need to be done
  * very often, since the counts should remain correct during normal operation.
- * NOTE: this function pair should ONLY be called during startup.  It is NOT
- * thread safe.
  */
-void check_ref_counts_backend(struct room *qrbuf, void *data) {
-       struct floor flbuf;
+void check_ref_counts_backend(struct ctdlroom *qrbuf, void *data) {
+
+       int *new_refcounts;
+
+       new_refcounts = (int *) data;
 
-       getfloor(&flbuf, qrbuf->QRfloor);
-       ++flbuf.f_ref_count;
-       flbuf.f_flags = flbuf.f_flags | QR_INUSE;
-       putfloor(&flbuf, qrbuf->QRfloor);
+       ++new_refcounts[(int)qrbuf->QRfloor];
 }
 
 void check_ref_counts(void) {
        struct floor flbuf;
        int a;
 
-       lprintf(7, "Checking floor reference counts\n");
+       int new_refcounts[MAXFLOORS];
+
+       lprintf(CTDL_DEBUG, "Checking floor reference counts\n");
        for (a=0; a<MAXFLOORS; ++a) {
-               getfloor(&flbuf, a);
-               flbuf.f_ref_count = 0;
-               flbuf.f_flags = flbuf.f_flags & ~QR_INUSE;
-               putfloor(&flbuf, a);
+               new_refcounts[a] = 0;
        }
 
        cdb_begin_transaction();
-       ForEachRoom(check_ref_counts_backend, NULL);
+       ForEachRoom(check_ref_counts_backend, (void *)new_refcounts );
        cdb_end_transaction();
+
+       for (a=0; a<MAXFLOORS; ++a) {
+               lgetfloor(&flbuf, a);
+               flbuf.f_ref_count = new_refcounts[a];
+               if (new_refcounts[a] > 0) {
+                       flbuf.f_flags = flbuf.f_flags | QR_INUSE;
+               }
+               else {
+                       flbuf.f_flags = flbuf.f_flags & ~QR_INUSE;
+               }
+               lputfloor(&flbuf, a);
+               lprintf(CTDL_DEBUG, "Floor %d: %d rooms\n", a, new_refcounts[a]);
+       }
 }      
 
 /*