diff --git a/src/gc.c b/src/gc.c index 1aaf036afa..3d6514ca3c 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 e5569a5da5..e6a63f8452 100644 --- a/src/shmem.c +++ b/src/shmem.c @@ -1210,31 +1210,25 @@ 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; - - // 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; - - // Update the last slot index - shmSettings->qps.last = slot; - } + const unsigned int slot = timestamp % QPS_AVGLEN; // Add the query shmSettings->qps.buf[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; + + // Reset the query count + shmSettings->qps.buf[slot] = 0; +} + // Compute queries per second (qps) value double __attribute__((pure)) get_qps(void) { diff --git a/src/shmem.h b/src/shmem.h index f717445ee2..7afb206eb8 100644 --- a/src/shmem.h +++ b/src/shmem.h @@ -155,7 +155,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