From 631dcb42d1be0896c14e7830a45a5db4e3ee5ef6 Mon Sep 17 00:00:00 2001 From: David Reiss Date: Wed, 5 Mar 2008 07:51:40 +0000 Subject: [PATCH] Thrift: concurrency/Util.h: Add converters for 'struct timeval', cleanup Summary: - Added 'struct timeval' toMilliseconds and toTimeval converters modeled on the timespec ones - Added constants for microsecs, and got rid of the 500000 and 500 magic #'s :) Reviewed By: dreiss Test Plan: works in my test env Revert: OK DiffCamp Revision: 8742 git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665554 13f79535-47bb-0310-9956-ffa450edef68 --- lib/cpp/src/concurrency/Util.h | 48 +++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/lib/cpp/src/concurrency/Util.h b/lib/cpp/src/concurrency/Util.h index 29e3567d..4031be09 100644 --- a/lib/cpp/src/concurrency/Util.h +++ b/lib/cpp/src/concurrency/Util.h @@ -37,13 +37,16 @@ namespace facebook { namespace thrift { namespace concurrency { class Util { static const int64_t NS_PER_S = 1000000000LL; + static const int64_t US_PER_S = 1000000LL; static const int64_t MS_PER_S = 1000LL; - static const int64_t NS_PER_MS = 1000000LL; + + static const int64_t NS_PER_MS = NS_PER_S / MS_PER_S; + static const int64_t US_PER_MS = US_PER_S / MS_PER_S; public: /** - * Converts timespec to milliseconds + * Converts millisecond timestamp into a timespec struct * * @param struct timespec& result * @param time or duration in milliseconds @@ -53,37 +56,52 @@ class Util { result.tv_nsec = (value % MS_PER_S) * NS_PER_MS; // ms to ns } + static void toTimeval(struct timeval& result, int64_t value) { + result.tv_sec = value / MS_PER_S; // ms to s + result.tv_usec = (value % MS_PER_S) * US_PER_MS; // ms to us + } + /** - * Converts timespec to milliseconds + * Converts struct timespec to milliseconds */ static const void toMilliseconds(int64_t& result, const struct timespec& value) { - result = - (value.tv_sec * MS_PER_S) + - (value.tv_nsec / NS_PER_MS) + - (value.tv_nsec % NS_PER_MS >= 500000 ? 1 : 0); + result = (value.tv_sec * MS_PER_S) + (value.tv_nsec / NS_PER_MS); + // round up -- int64_t cast is to avoid a compiler error for some GCCs + if (int64_t(value.tv_nsec) % NS_PER_MS >= (NS_PER_MS / 2)) { + ++result; + } + } + + /** + * Converts struct timeval to milliseconds + */ + static const void toMilliseconds(int64_t& result, const struct timeval& value) { + result = (value.tv_sec * MS_PER_S) + (value.tv_usec / US_PER_MS); + // round up -- int64_t cast is to avoid a compiler error for some GCCs + if (int64_t(value.tv_usec) % US_PER_MS >= (US_PER_MS / 2)) { + ++result; + } } /** * Get current time as milliseconds from epoch */ static const int64_t currentTime() { + int64_t result; + #if defined(HAVE_CLOCK_GETTIME) struct timespec now; int ret = clock_gettime(CLOCK_REALTIME, &now); assert(ret == 0); - return - (now.tv_sec * MS_PER_S) + - (now.tv_nsec / NS_PER_MS) + - (now.tv_nsec % NS_PER_MS >= 500000 ? 1 : 0) ; + toMilliseconds(result, now); #elif defined(HAVE_GETTIMEOFDAY) struct timeval now; int ret = gettimeofday(&now, NULL); assert(ret == 0); - return - (((int64_t)now.tv_sec) * MS_PER_S) + - (now.tv_usec / MS_PER_S) + - (now.tv_usec % MS_PER_S >= 500 ? 1 : 0); + toMilliseconds(result, now); #endif // defined(HAVE_GETTIMEDAY) + + return result; } }; -- 2.17.1