blob: 483d14a579a49dc55d820caf6200f91647e4a3bc [file] [log] [blame]
Mark Slee9f0c6512007-02-28 23:58:26 +00001// Copyright (c) 2006- Facebook
2// Distributed under the Thrift Software License
3//
4// See accompanying file LICENSE or visit the Thrift site at:
5// http://developers.facebook.com/thrift/
6
Mark Sleef5f2be42006-09-05 21:05:31 +00007#ifndef _THRIFT_CONCURRENCY_UTIL_H_
8#define _THRIFT_CONCURRENCY_UTIL_H_ 1
Marc Slemko0e53ccd2006-07-17 23:51:05 +00009
10#include <assert.h>
Marc Slemko03dedd92006-07-20 00:58:47 +000011#include <stddef.h>
David Reiss53f18f02008-07-11 00:45:29 +000012#include <stdint.h>
Marc Slemkoe6889de2006-08-12 00:32:53 +000013#include <time.h>
Marc Slemkod42a2c22006-08-10 03:30:18 +000014#include <sys/time.h>
Marc Slemko0e53ccd2006-07-17 23:51:05 +000015
David Reiss0c90f6f2008-02-06 22:18:40 +000016namespace facebook { namespace thrift { namespace concurrency {
Marc Slemko0e53ccd2006-07-17 23:51:05 +000017
Mark Sleef5f2be42006-09-05 21:05:31 +000018/**
19 * Utility methods
20 *
21 * This class contains basic utility methods for converting time formats,
22 * and other common platform-dependent concurrency operations.
23 * It should not be included in API headers for other concurrency library
24 * headers, since it will, by definition, pull in all sorts of horrid
David Reiss0c90f6f2008-02-06 22:18:40 +000025 * platform dependent crap. Rather it should be inluded directly in
Mark Sleef5f2be42006-09-05 21:05:31 +000026 * concurrency library implementation source.
27 *
28 * @author marc
29 * @version $Id:$
30 */
Marc Slemko0e53ccd2006-07-17 23:51:05 +000031class Util {
32
Mark Slee9b82d272007-05-23 05:16:07 +000033 static const int64_t NS_PER_S = 1000000000LL;
David Reiss631dcb42008-03-05 07:51:40 +000034 static const int64_t US_PER_S = 1000000LL;
Mark Slee9b82d272007-05-23 05:16:07 +000035 static const int64_t MS_PER_S = 1000LL;
David Reiss631dcb42008-03-05 07:51:40 +000036
37 static const int64_t NS_PER_MS = NS_PER_S / MS_PER_S;
38 static const int64_t US_PER_MS = US_PER_S / MS_PER_S;
Marc Slemkoc7782972006-07-25 02:26:35 +000039
Marc Slemko0e53ccd2006-07-17 23:51:05 +000040 public:
41
Mark Sleef5f2be42006-09-05 21:05:31 +000042 /**
David Reiss631dcb42008-03-05 07:51:40 +000043 * Converts millisecond timestamp into a timespec struct
Mark Sleef5f2be42006-09-05 21:05:31 +000044 *
45 * @param struct timespec& result
46 * @param time or duration in milliseconds
47 */
Mark Slee9b82d272007-05-23 05:16:07 +000048 static void toTimespec(struct timespec& result, int64_t value) {
David Reiss0c90f6f2008-02-06 22:18:40 +000049 result.tv_sec = value / MS_PER_S; // ms to s
Marc Slemkoc7782972006-07-25 02:26:35 +000050 result.tv_nsec = (value % MS_PER_S) * NS_PER_MS; // ms to ns
Marc Slemko0e53ccd2006-07-17 23:51:05 +000051 }
52
David Reiss631dcb42008-03-05 07:51:40 +000053 static void toTimeval(struct timeval& result, int64_t value) {
54 result.tv_sec = value / MS_PER_S; // ms to s
55 result.tv_usec = (value % MS_PER_S) * US_PER_MS; // ms to us
56 }
57
Mark Sleef5f2be42006-09-05 21:05:31 +000058 /**
David Reiss631dcb42008-03-05 07:51:40 +000059 * Converts struct timespec to milliseconds
Mark Sleef5f2be42006-09-05 21:05:31 +000060 */
Mark Slee9b82d272007-05-23 05:16:07 +000061 static const void toMilliseconds(int64_t& result, const struct timespec& value) {
David Reiss631dcb42008-03-05 07:51:40 +000062 result = (value.tv_sec * MS_PER_S) + (value.tv_nsec / NS_PER_MS);
63 // round up -- int64_t cast is to avoid a compiler error for some GCCs
64 if (int64_t(value.tv_nsec) % NS_PER_MS >= (NS_PER_MS / 2)) {
65 ++result;
66 }
67 }
68
69 /**
70 * Converts struct timeval to milliseconds
71 */
72 static const void toMilliseconds(int64_t& result, const struct timeval& value) {
73 result = (value.tv_sec * MS_PER_S) + (value.tv_usec / US_PER_MS);
74 // round up -- int64_t cast is to avoid a compiler error for some GCCs
75 if (int64_t(value.tv_usec) % US_PER_MS >= (US_PER_MS / 2)) {
76 ++result;
77 }
Marc Slemko0e53ccd2006-07-17 23:51:05 +000078 }
79
Mark Sleef5f2be42006-09-05 21:05:31 +000080 /**
81 * Get current time as milliseconds from epoch
82 */
David Reiss53f18f02008-07-11 00:45:29 +000083 static const int64_t currentTime();
Marc Slemko0e53ccd2006-07-17 23:51:05 +000084};
85
Marc Slemko0e53ccd2006-07-17 23:51:05 +000086}}} // facebook::thrift::concurrency
87
Mark Sleef5f2be42006-09-05 21:05:31 +000088#endif // #ifndef _THRIFT_CONCURRENCY_UTIL_H_