From: Zdenek Kabelac Date: Wed, 4 Mar 2020 14:56:09 +0000 (+0100) Subject: dmeventd: enhance time waiting loop X-Git-Tag: v2_03_09~11 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=212cf8efbdc1c67f8ea85c951873b0fc3249eb07;p=lvm2.git dmeventd: enhance time waiting loop dmeventd is 'scanning' statuses in loop (most usually in 10sec intervals) - and meanwhile it sleeps within: pthread_cond_timedwait() However this function call tends to wakeup sometimes a short amount of time sooner - and our code still believe the 'right time' has not yet arrived and basically for a moment 'busy-looped' on calling this function - so for systems with 'clock_gettime()' present we obtain time and we go 10ms to the future second - this avoids unneeded repeated invocation of our time scheduling loop. TODO: monitoring during 1 hour 'time-change'... --- diff --git a/daemons/dmeventd/dmeventd.c b/daemons/dmeventd/dmeventd.c index 36a35ba04..96e70919b 100644 --- a/daemons/dmeventd/dmeventd.c +++ b/daemons/dmeventd/dmeventd.c @@ -752,7 +752,7 @@ static void _exit_timeout(void *unused __attribute__((unused))) static void *_timeout_thread(void *unused __attribute__((unused))) { struct thread_status *thread; - struct timespec timeout; + struct timespec timeout, real_time; time_t curr_time; int ret; @@ -763,7 +763,16 @@ static void *_timeout_thread(void *unused __attribute__((unused))) while (!dm_list_empty(&_timeout_registry)) { timeout.tv_sec = 0; timeout.tv_nsec = 0; +#ifndef HAVE_REALTIME curr_time = time(NULL); +#else + if (clock_gettime(CLOCK_REALTIME, &real_time)) { + log_error("Failed to read clock_gettime()."); + break; + } + /* 10ms back to the future */ + curr_time = real_time.tv_sec + ((real_time.tv_nsec > (1000000000 - 10000000)) ? 1 : 0); +#endif dm_list_iterate_items_gen(thread, &_timeout_registry, timeout_list) { if (thread->next_time <= curr_time) {