Back to index

citadel  8.12
Functions
housekeeping.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void check_sched_shutdown (void)
void check_ref_counts (void)
void do_housekeeping (void)

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_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: