summaryrefslogtreecommitdiff
path: root/bench/workgen/workgen_time.h
diff options
context:
space:
mode:
Diffstat (limited to 'bench/workgen/workgen_time.h')
-rw-r--r--bench/workgen/workgen_time.h201
1 files changed, 201 insertions, 0 deletions
diff --git a/bench/workgen/workgen_time.h b/bench/workgen/workgen_time.h
new file mode 100644
index 00000000000..f33eb64d9c9
--- /dev/null
+++ b/bench/workgen/workgen_time.h
@@ -0,0 +1,201 @@
+/*-
+ * Public Domain 2014-2017 MongoDB, Inc.
+ * Public Domain 2008-2014 WiredTiger, Inc.
+ *
+ * This is free and unencumbered software released into the public domain.
+ *
+ * Anyone is free to copy, modify, publish, use, compile, sell, or
+ * distribute this software, either in source code form or as a compiled
+ * binary, for any purpose, commercial or non-commercial, and by any
+ * means.
+ *
+ * In jurisdictions that recognize copyright laws, the author or authors
+ * of this software dedicate any and all copyright interest in the
+ * software to the public domain. We make this dedication for the benefit
+ * of the public at large and to the detriment of our heirs and
+ * successors. We intend this dedication to be an overt act of
+ * relinquishment in perpetuity of all present and future rights to this
+ * software under copyright law.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+#define THOUSAND (1000ULL)
+#define MILLION (1000000ULL)
+#define BILLION (1000000000ULL)
+
+#define NSEC_PER_SEC BILLION
+#define USEC_PER_SEC MILLION
+#define MSEC_PER_SEC THOUSAND
+
+#define ns_to_ms(v) ((v) / MILLION)
+#define ns_to_sec(v) ((v) / BILLION)
+#define ns_to_us(v) ((v) / THOUSAND)
+
+#define us_to_ms(v) ((v) / THOUSAND)
+#define us_to_ns(v) ((v) * THOUSAND)
+#define us_to_sec(v) ((v) / MILLION)
+
+#define ms_to_ns(v) ((v) * MILLION)
+#define ms_to_us(v) ((v) * THOUSAND)
+#define ms_to_sec(v) ((v) / THOUSAND)
+
+#define sec_to_ns(v) ((v) * BILLION)
+#define sec_to_us(v) ((v) * MILLION)
+#define sec_to_ms(v) ((v) * THOUSAND)
+
+inline std::ostream&
+operator<<(std::ostream &os, const timespec &ts)
+{
+ char oldfill;
+ std::streamsize oldwidth;
+
+ os << ts.tv_sec << ".";
+ oldfill = os.fill('0');
+ oldwidth = os.width(3);
+ os << (int)ns_to_ms(ts.tv_nsec);
+ os.fill(oldfill);
+ os.width(oldwidth);
+ return (os);
+}
+
+inline timespec
+operator-(const timespec &lhs, const timespec &rhs)
+{
+ timespec ts;
+
+ if (lhs.tv_nsec < rhs.tv_nsec) {
+ ts.tv_sec = lhs.tv_sec - rhs.tv_sec - 1;
+ ts.tv_nsec = lhs.tv_nsec - rhs.tv_nsec + NSEC_PER_SEC;
+ } else {
+ ts.tv_sec = lhs.tv_sec - rhs.tv_sec;
+ ts.tv_nsec = lhs.tv_nsec - rhs.tv_nsec;
+ }
+ return (ts);
+}
+
+inline timespec
+operator+(const timespec &lhs, const int n)
+{
+ timespec ts = lhs;
+ ts.tv_sec += n;
+ return (ts);
+}
+
+inline bool
+operator<(const timespec &lhs, const timespec &rhs)
+{
+ if (lhs.tv_sec == rhs.tv_sec)
+ return (lhs.tv_nsec < rhs.tv_nsec);
+ else
+ return (lhs.tv_sec < rhs.tv_sec);
+}
+
+inline bool
+operator>(const timespec &lhs, const timespec &rhs)
+{
+ if (lhs.tv_sec == rhs.tv_sec)
+ return (lhs.tv_nsec > rhs.tv_nsec);
+ else
+ return (lhs.tv_sec > rhs.tv_sec);
+}
+
+inline bool
+operator>=(const timespec &lhs, const timespec &rhs)
+{
+ return (!(lhs < rhs));
+}
+
+inline bool
+operator<=(const timespec &lhs, const timespec &rhs)
+{
+ return (!(lhs > rhs));
+}
+
+inline bool
+operator==(const timespec &lhs, int n)
+{
+ return (lhs.tv_sec == n && lhs.tv_nsec == 0);
+}
+
+inline bool
+operator!=(const timespec &lhs, int n)
+{
+ return (lhs.tv_sec != n || lhs.tv_nsec != 0);
+}
+
+inline timespec &
+operator+=(timespec &lhs, const int n)
+{
+ lhs.tv_sec += n;
+ return (lhs);
+}
+
+inline bool
+operator==(const timespec &lhs, const timespec &rhs)
+{
+ return (lhs.tv_sec == rhs.tv_sec && lhs.tv_nsec == rhs.tv_nsec);
+}
+
+inline timespec &
+operator-=(timespec &lhs, const timespec &rhs)
+{
+ lhs.tv_sec -= rhs.tv_sec;
+ lhs.tv_nsec -= rhs.tv_nsec;
+ if (lhs.tv_nsec < 0) {
+ lhs.tv_nsec += NSEC_PER_SEC;
+ lhs.tv_sec -= 1;
+ }
+ return (lhs);
+}
+
+inline timespec
+ts_add_ms(const timespec &lhs, const uint64_t n)
+{
+ timespec ts;
+
+ ts.tv_sec = lhs.tv_sec + ms_to_sec(n);
+ ts.tv_nsec = lhs.tv_nsec + ms_to_ns(n % THOUSAND);
+ while ((unsigned long)ts.tv_nsec > NSEC_PER_SEC) {
+ ts.tv_nsec -= NSEC_PER_SEC;
+ ts.tv_sec++;
+ }
+ return (ts);
+}
+
+inline void
+ts_assign(timespec &lhs, const timespec &rhs)
+{
+ lhs.tv_sec = rhs.tv_sec;
+ lhs.tv_nsec = rhs.tv_nsec;
+}
+
+inline void
+ts_clear(timespec &ts)
+{
+ ts.tv_sec = 0;
+ ts.tv_nsec = 0;
+}
+
+inline uint64_t
+ts_sec(const timespec &ts)
+{
+ return (ns_to_sec(ts.tv_nsec) + ts.tv_sec);
+}
+
+inline uint64_t
+ts_ms(const timespec &ts)
+{
+ return (ns_to_ms(ts.tv_nsec) + sec_to_ms(ts.tv_sec));
+}
+
+inline uint64_t
+ts_us(const timespec &ts)
+{
+ return (ns_to_us(ts.tv_nsec) + sec_to_us(ts.tv_sec));
+}