Currently, we always round down, which has a bad side effect: when a
timer comes closer, we have lots of early wakeups, and eventually
we'll run into a busy loop (timeout=0) when the timeout is less than
one millisecond; the process will remain this busy loop for one
millisecond, wasting lots of CPU time.
Signed-off-by: Max Kellermann <max.kellermann@ionos.com>
#ifndef CEPH_MSG_TIMEOUT_H
#define CEPH_MSG_TIMEOUT_H
+#include "include/intarith.h" // for div_round_up()
+
#include <time.h> // for struct timeval
/**
constexpr int
timeout_to_milliseconds(const struct timeval &tv) noexcept
{
- return tv.tv_sec * 1000 + tv.tv_usec / 1000;
+ /* round up to the next millisecond so we don't wake up too early */
+ return tv.tv_sec * 1000 + div_round_up(tv.tv_usec, 1000);
}
/**