Back to index

citadel  8.12
Functions | Variables
housekeeping.c File Reference
#include "sysdep.h"
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <ctype.h>
#include <string.h>
#include <errno.h>
#include <limits.h>
#include <sys/types.h>
#include <syslog.h>
#include <libcitadel.h>
#include "citadel.h"
#include "server.h"
#include "serv_extensions.h"
#include "citserver.h"
#include "config.h"
#include "housekeeping.h"
#include "sysdep_decls.h"
#include "room_ops.h"
#include "database.h"
#include "msgbase.h"
#include "journaling.h"
#include "ctdl_module.h"
#include "threads.h"

Go to the source code of this file.

Functions

void check_sched_shutdown (void)
void check_ref_counts_backend (struct ctdlroom *qrbuf, void *data)
void check_ref_counts (void)
void do_housekeeping (void)

Variables

static int housekeeping_in_progress = 0
static time_t last_timer = 0L

Function Documentation

void check_ref_counts ( void  )

Definition at line 85 of file housekeeping.c.

                            {
       struct floor flbuf;
       int a;

       int new_refcounts[MAXFLOORS];

       syslog(LOG_DEBUG, "Checking floor reference counts\n");
       for (a=0; a<MAXFLOORS; ++a) {
              new_refcounts[a] = 0;
       }

       cdb_begin_transaction();
       CtdlForEachRoom(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);
              syslog(LOG_DEBUG, "Floor %d: %d rooms\n", a, new_refcounts[a]);
       }
}      

Here is the call graph for this function:

Here is the caller graph for this function:

void check_ref_counts_backend ( struct ctdlroom qrbuf,
void *  data 
)

Definition at line 76 of file housekeeping.c.

                                                                  {

       int *new_refcounts;

       new_refcounts = (int *) data;

       ++new_refcounts[(int)qrbuf->QRfloor];
}

Here is the caller graph for this function:

void check_sched_shutdown ( void  )

Definition at line 63 of file housekeeping.c.

                                {
       if ((ScheduledShutdown == 1) && (ContextList == NULL)) {
              syslog(LOG_NOTICE, "Scheduled shutdown initiating.\n");
              server_shutting_down = 1;
       }
}
void do_housekeeping ( void  )

Definition at line 122 of file housekeeping.c.

                           {
       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;
       }
       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.
        */

       now = time(NULL);
       if ( (now - last_timer) > (time_t)60 ) {
              do_perminute_housekeeping_now = 1;
              last_timer = time(NULL);
       }

       /* First, do the "as often as needed" stuff... */
       JournalRunQueue();
       PerformSessionHooks(EVT_HOUSE);

       /* Then, do the "once per minute" stuff... */
       if (do_perminute_housekeeping_now) {
              cdb_check_handles();               /* suggested by Justin Case */
              PerformSessionHooks(EVT_TIMER);           /* Run any timer hooks */
       }

       /*
        * All done.
        */
       begin_critical_section(S_HOUSEKEEPING);
       housekeeping_in_progress = 0;
       end_critical_section(S_HOUSEKEEPING);
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

int housekeeping_in_progress = 0 [static]

Definition at line 120 of file housekeeping.c.

time_t last_timer = 0L [static]

Definition at line 121 of file housekeeping.c.