diff --git a/src/gc.c b/src/gc.c index 1aaf036af..3d6514ca3 100644 --- a/src/gc.c +++ b/src/gc.c @@ -560,6 +560,15 @@ void *GC_thread(void *val) reread_config(); } + // Intermediate cancellation-point + if(killed) + break; + + // Reset the queries-per-second counter + lock_shm(); + reset_qps(now); + unlock_shm(); + thread_sleepms(GC, 1000); } diff --git a/src/shmem.c b/src/shmem.c index e5569a5da..7a343de1b 100644 --- a/src/shmem.c +++ b/src/shmem.c @@ -1210,29 +1210,23 @@ int __attribute__((pure)) is_shm_fd(const int fd) // Update queries per second (qps) value // This is done in shared memory to allow for both UDP and TCP workers to // contribute. -void update_qps(const double timestamp) +void update_qps(const time_t timestamp) { // Get the timeslot for the current timestamp - const unsigned int slot = (unsigned int)timestamp % QPS_AVGLEN; + const unsigned int slot = timestamp % QPS_AVGLEN; - // Check if the timestamp is in the same slot as the last one - if(shmSettings->qps.last != slot) - { - // Reset all the slots in between - // This is relevant if less than one query per second is - // received and the intermediate slots are not updated - for(unsigned int i = (shmSettings->qps.last + 1) % QPS_AVGLEN; i != slot; i = (i + 1) % QPS_AVGLEN) - shmSettings->qps.buf[i] = 0; - - // Reset the current slot - shmSettings->qps.buf[slot] = 0; + // Add the query + shmSettings->qps[slot]++; +} - // Update the last slot index - shmSettings->qps.last = slot; - } +// Reset queries per second (qps) value for a given timeslot +void reset_qps(const time_t timestamp) +{ + // Get the timeslot for the current timestamp + const unsigned int slot = timestamp % QPS_AVGLEN; - // Add the query - shmSettings->qps.buf[slot]++; + // Reset the query count + shmSettings->qps[slot] = 0; } // Compute queries per second (qps) value @@ -1245,7 +1239,7 @@ double __attribute__((pure)) get_qps(void) // double qps = 0.0; for(unsigned int i = 0; i < QPS_AVGLEN; i++) - qps += shmSettings->qps.buf[i]; + qps += shmSettings->qps[i]; return qps / QPS_AVGLEN; } diff --git a/src/shmem.h b/src/shmem.h index f717445ee..5f37a56b8 100644 --- a/src/shmem.h +++ b/src/shmem.h @@ -31,10 +31,7 @@ typedef struct { pid_t pid; unsigned int global_shm_counter; unsigned int next_str_pos; - struct { - unsigned int last; - unsigned int buf[QPS_AVGLEN]; - } qps; + unsigned int qps[QPS_AVGLEN]; } ShmSettings; typedef struct { @@ -155,7 +152,8 @@ void set_per_client_regex(const int clientID, const int regexID, const bool valu // Used in dnsmasq/utils.c int is_shm_fd(const int fd); -void update_qps(const double timestamp); +void update_qps(const time_t timestamp); +void reset_qps(const time_t timestamp); double get_qps(void) __attribute__((pure)); #endif //SHARED_MEMORY_SERVER_H