From: Wilfried Goesgens Date: Tue, 5 Jun 2012 18:52:25 +0000 (+0200) Subject: housekeeping: time() is expensive. don't use it inside a mutex. X-Git-Tag: v8.12~29^2~2 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=33502541aa826af281eb317c51da70a5a883fff4 housekeeping: time() is expensive. don't use it inside a mutex. --- diff --git a/citadel/housekeeping.c b/citadel/housekeeping.c index f4d930d64..6eb6440b7 100644 --- a/citadel/housekeeping.c +++ b/citadel/housekeeping.c @@ -117,9 +117,9 @@ void check_ref_counts(void) { * only allow housekeeping to execute once per minute, and we only allow one * instance to run at a time. */ +static int housekeeping_in_progress = 0; +static time_t last_timer = 0L; void do_housekeeping(void) { - static int housekeeping_in_progress = 0; - static time_t last_timer = 0L; int do_housekeeping_now = 0; int do_perminute_housekeeping_now = 0; time_t now; @@ -133,11 +133,6 @@ void do_housekeeping(void) { if (housekeeping_in_progress == 0) { do_housekeeping_now = 1; housekeeping_in_progress = 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); @@ -150,6 +145,12 @@ void do_housekeeping(void) { * 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); @@ -163,5 +164,7 @@ void do_housekeeping(void) { /* * All done. */ + begin_critical_section(S_HOUSEKEEPING); housekeeping_in_progress = 0; + end_critical_section(S_HOUSEKEEPING); }