static void test_timeval_diff(void) { static struct timeval input[] = { { 1, 0 }, { 0, 999999 }, { 1, 0 }, { 0, 999001 }, { 1, 1 }, { 0, 999001 }, { 2, 1 }, { 1, 0 }, { INT_MAX, 0 }, { INT_MAX-1, 1 } }; static int output[] = { 1, 999, 1000, 1000001, 999999 }; unsigned int i; long long udiff; int mdiff; test_begin("timeval_diff_*()"); for (i = 0; i < N_ELEMENTS(input); i += 2) { udiff = timeval_diff_usecs(&input[i], &input[i+1]); mdiff = timeval_diff_msecs(&input[i], &input[i+1]); test_assert(udiff == output[i/2]); test_assert(mdiff == udiff/1000); udiff = timeval_diff_usecs(&input[i+1], &input[i]); mdiff = timeval_diff_msecs(&input[i+1], &input[i]); test_assert(udiff == -output[i/2]); test_assert(mdiff == udiff/1000); } test_end(); }
bool command_exec(struct client_command_context *cmd) { const struct command_hook *hook; long long diff; bool finished; if (cmd->last_ioloop_time.tv_sec != 0) { diff = timeval_diff_usecs(&ioloop_timeval, &cmd->last_ioloop_time); if (diff > 0) cmd->usecs_in_ioloop += diff; } array_foreach(&command_hooks, hook) hook->pre(cmd); finished = cmd->func(cmd); array_foreach(&command_hooks, hook) hook->post(cmd); if (cmd->state == CLIENT_COMMAND_STATE_DONE) finished = TRUE; if (!finished) { io_loop_time_refresh(); cmd->last_ioloop_time = ioloop_timeval; } return finished; }
static void timeval_add_diff(struct timeval *dest, const struct timeval *newsrc, const struct timeval *oldsrc) { long long usecs; usecs = timeval_diff_usecs(newsrc, oldsrc); dest->tv_sec += usecs / USECS_PER_SEC; dest->tv_usec += usecs % USECS_PER_SEC; if (dest->tv_usec > USECS_PER_SEC) { dest->tv_usec -= USECS_PER_SEC; dest->tv_sec++; } }
int timeval_diff_msecs(const struct timeval *tv1, const struct timeval *tv2) { return timeval_diff_usecs(tv1, tv2) / 1000; }