Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CLOCK_MONOTONIC Max value

Tags:

c

linux

time

When will clock_gettime() return a smaller value, using CLOCK_MONOTONIC, due to reaching it's maximum value? I don't mean the little warps that have been described as bugs, but something like a counter reset.

Is it time measured, or is it related to the absolute number of ticks?

I have to implement a timer (1 or 2 second intervals), and i don't need that much precision. But the aplication may be running several hours without restarting. (i estimate 1 day max).

I wan't to be shure i won't make any mistakes that may lead to it stop comunicating.

Does timerfd already takes care of this issue?

like image 554
Flinger Avatar asked Feb 21 '11 12:02

Flinger


2 Answers

As struct timespec uses a time_t value for seconds, the complete range that can be covered is at least 68 years. Given the definition of CLOCK_MONOTONIC as starting at some arbitrary point, in theory clock_gettime could overrun anytime. In practice, you only need to worry about this if your app runs for some decades. But, if you're paranoid, make a wrapper function that complains loudly and kills the application if a timer wraparound happens.

like image 190
Erik Avatar answered Oct 03 '22 23:10

Erik


CLOCK_MONOTONIC, as implied by the "monotonic" name never goes back in time, it is always growing. Will not change if the user or another process (like NTP) changes the "wall" clock on the machine. CLOCK_MONOTONIC is the right timescale to use in timers. It can eventually roll over but even that can be handled cleanly if you do it carefully. Use the same type of variable for the internal timer.

For example the following code will work OK eve if the clock wraps around. Note: kDelayInterval has to be smaller than the wrap around period (this is normally not a problem).

struct timespec current_time;
struct timespec last_update = {0,0};
  .
  .
  clock_gettime(CLOCK_MONOTONIC, &current_time);
  if((current_time.tv_sec - last_update.tv_sec) > kDelayInterval)
  {
    .
    .
    .
    clock_gettime(CLOCK_MONOTONIC, &last_update);
  }
like image 20
gatoAlfa Avatar answered Oct 04 '22 00:10

gatoAlfa