diff options
Diffstat (limited to 'bench/workgen/workgen_time.h')
-rw-r--r-- | bench/workgen/workgen_time.h | 201 |
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)); +} |