X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftime%2Ftime.c;h=166832d8a961d56b8ebcf9ebd4b58c62d1b1e4ed;hp=65a257b3fe0a28d6ceb01ffa323262237fd21467;hb=8b09a6d9f6b27ebb2d0719388d1cf7067083fe2d;hpb=2012d45e273c3016dbd09b2606efc9ffab07c57f diff --git a/ccan/time/time.c b/ccan/time/time.c index 65a257b3..166832d8 100644 --- a/ccan/time/time.c +++ b/ccan/time/time.c @@ -1,7 +1,7 @@ /* Licensed under BSD-MIT - see LICENSE file for details */ #include #include -#include +#include #if !HAVE_CLOCK_GETTIME && !HAVE_CLOCK_GETTIME_IN_LIBRT #include @@ -13,7 +13,7 @@ struct timespec time_now(void) gettimeofday(&now, NULL); ret.tv_sec = now.tv_sec; ret.tv_nsec = now.tv_usec * 1000; - return ret; + return TIME_CHECK(ret); } #else #include @@ -21,70 +21,17 @@ struct timespec time_now(void) { struct timespec ret; clock_gettime(CLOCK_REALTIME, &ret); - return ret; + return TIME_CHECK(ret); } #endif /* HAVE_CLOCK_GETTIME || HAVE_CLOCK_GETTIME_IN_LIBRT */ -bool time_greater(struct timespec a, struct timespec b) -{ - if (a.tv_sec > b.tv_sec) - return true; - else if (a.tv_sec < b.tv_sec) - return false; - - return a.tv_nsec > b.tv_nsec; -} - -bool time_less(struct timespec a, struct timespec b) -{ - if (a.tv_sec < b.tv_sec) - return true; - else if (a.tv_sec > b.tv_sec) - return false; - - return a.tv_nsec < b.tv_nsec; -} - -bool time_eq(struct timespec a, struct timespec b) -{ - return a.tv_sec == b.tv_sec && a.tv_nsec == b.tv_nsec; -} - -struct timespec time_sub(struct timespec recent, struct timespec old) -{ - struct timespec diff; - - diff.tv_sec = recent.tv_sec - old.tv_sec; - if (old.tv_nsec > recent.tv_nsec) { - diff.tv_sec--; - diff.tv_nsec = 1000000000 + recent.tv_nsec - old.tv_nsec; - } else - diff.tv_nsec = recent.tv_nsec - old.tv_nsec; - - assert(diff.tv_sec >= 0); - return diff; -} - -struct timespec time_add(struct timespec a, struct timespec b) -{ - struct timespec sum; - - sum.tv_sec = a.tv_sec + b.tv_sec; - sum.tv_nsec = a.tv_nsec + b.tv_nsec; - if (sum.tv_nsec >= 1000000000) { - sum.tv_sec++; - sum.tv_nsec -= 1000000000; - } - return sum; -} - struct timespec time_divide(struct timespec t, unsigned long div) { struct timespec res; uint64_t rem, ns; /* Dividing seconds is simple. */ - res.tv_sec = t.tv_sec / div; + res.tv_sec = TIME_CHECK(t).tv_sec / div; rem = t.tv_sec % div; /* If we can't fit remainder * 1,000,000,000 in 64 bits? */ @@ -104,7 +51,7 @@ struct timespec time_divide(struct timespec t, unsigned long div) ns = rem * 1000000000 + t.tv_nsec; res.tv_nsec = ns / div; } - return res; + return TIME_CHECK(res); } struct timespec time_multiply(struct timespec t, unsigned long mult) @@ -124,57 +71,33 @@ struct timespec time_multiply(struct timespec t, unsigned long mult) res.tv_nsec = nsec % 1000000000; res.tv_sec = nsec / 1000000000; } - res.tv_sec += t.tv_sec * mult; - return res; + res.tv_sec += TIME_CHECK(t).tv_sec * mult; + return TIME_CHECK(res); } -uint64_t time_to_msec(struct timespec t) +struct timespec time_check(struct timespec t, const char *abortstr) { - uint64_t msec; - - msec = t.tv_nsec / 1000000 + (uint64_t)t.tv_sec * 1000; - return msec; -} - -uint64_t time_to_usec(struct timespec t) -{ - uint64_t usec; - - usec = t.tv_nsec / 1000 + (uint64_t)t.tv_sec * 1000000; - return usec; -} - -uint64_t time_to_nsec(struct timespec t) -{ - uint64_t nsec; - - nsec = t.tv_nsec + (uint64_t)t.tv_sec * 1000000000; - return nsec; -} - -struct timespec time_from_msec(uint64_t msec) -{ - struct timespec t; - - t.tv_nsec = (msec % 1000) * 1000000; - t.tv_sec = msec / 1000; - return t; -} - -struct timespec time_from_usec(uint64_t usec) -{ - struct timespec t; - - t.tv_nsec = (usec % 1000000) * 1000; - t.tv_sec = usec / 1000000; - return t; -} - -struct timespec time_from_nsec(uint64_t nsec) -{ - struct timespec t; - - t.tv_nsec = nsec % 1000000000; - t.tv_sec = nsec / 1000000000; + if (t.tv_sec < 0 || t.tv_nsec >= 1000000000) { + if (abortstr) { + fprintf(stderr, "%s: malformed time %li.%09li\n", + abortstr, + (long)t.tv_sec, (long)t.tv_nsec); + abort(); + } else { + struct timespec old = t; + + if (t.tv_nsec >= 1000000000) { + t.tv_sec += t.tv_nsec / 1000000000; + t.tv_nsec %= 1000000000; + } + if (t.tv_sec < 0) + t.tv_sec = 0; + + fprintf(stderr, "WARNING: malformed time" + " %li seconds %li ns converted to %li.%09li.\n", + (long)old.tv_sec, (long)old.tv_nsec, + (long)t.tv_sec, (long)t.tv_nsec); + } + } return t; }