| #include "jemalloc/internal/jemalloc_internal.h" |
| |
| #define BILLION UINT64_C(1000000000) |
| |
| void |
| nstime_init(nstime_t *time, uint64_t ns) |
| { |
| |
| time->ns = ns; |
| } |
| |
| void |
| nstime_init2(nstime_t *time, uint64_t sec, uint64_t nsec) |
| { |
| |
| time->ns = sec * BILLION + nsec; |
| } |
| |
| uint64_t |
| nstime_ns(const nstime_t *time) |
| { |
| |
| return (time->ns); |
| } |
| |
| uint64_t |
| nstime_sec(const nstime_t *time) |
| { |
| |
| return (time->ns / BILLION); |
| } |
| |
| uint64_t |
| nstime_nsec(const nstime_t *time) |
| { |
| |
| return (time->ns % BILLION); |
| } |
| |
| void |
| nstime_copy(nstime_t *time, const nstime_t *source) |
| { |
| |
| *time = *source; |
| } |
| |
| int |
| nstime_compare(const nstime_t *a, const nstime_t *b) |
| { |
| |
| return ((a->ns > b->ns) - (a->ns < b->ns)); |
| } |
| |
| void |
| nstime_add(nstime_t *time, const nstime_t *addend) |
| { |
| |
| assert(UINT64_MAX - time->ns >= addend->ns); |
| |
| time->ns += addend->ns; |
| } |
| |
| void |
| nstime_subtract(nstime_t *time, const nstime_t *subtrahend) |
| { |
| |
| assert(nstime_compare(time, subtrahend) >= 0); |
| |
| time->ns -= subtrahend->ns; |
| } |
| |
| void |
| nstime_imultiply(nstime_t *time, uint64_t multiplier) |
| { |
| |
| assert((((time->ns | multiplier) & (UINT64_MAX << (sizeof(uint64_t) << |
| 2))) == 0) || ((time->ns * multiplier) / multiplier == time->ns)); |
| |
| time->ns *= multiplier; |
| } |
| |
| void |
| nstime_idivide(nstime_t *time, uint64_t divisor) |
| { |
| |
| assert(divisor != 0); |
| |
| time->ns /= divisor; |
| } |
| |
| uint64_t |
| nstime_divide(const nstime_t *time, const nstime_t *divisor) |
| { |
| |
| assert(divisor->ns != 0); |
| |
| return (time->ns / divisor->ns); |
| } |
| |
| #ifdef JEMALLOC_JET |
| #undef nstime_update |
| #define nstime_update JEMALLOC_N(n_nstime_update) |
| #endif |
| bool |
| nstime_update(nstime_t *time) |
| { |
| nstime_t old_time; |
| |
| nstime_copy(&old_time, time); |
| |
| #ifdef _WIN32 |
| { |
| FILETIME ft; |
| uint64_t ticks; |
| GetSystemTimeAsFileTime(&ft); |
| ticks = (((uint64_t)ft.dwHighDateTime) << 32) | |
| ft.dwLowDateTime; |
| time->ns = ticks * 100; |
| } |
| #elif JEMALLOC_CLOCK_GETTIME |
| { |
| struct timespec ts; |
| |
| if (sysconf(_SC_MONOTONIC_CLOCK) > 0) |
| clock_gettime(CLOCK_MONOTONIC, &ts); |
| else |
| clock_gettime(CLOCK_REALTIME, &ts); |
| time->ns = ts.tv_sec * BILLION + ts.tv_nsec; |
| } |
| #else |
| { |
| struct timeval tv; |
| gettimeofday(&tv, NULL); |
| time->ns = tv.tv_sec * BILLION + tv.tv_usec * 1000; |
| } |
| #endif |
| |
| /* Handle non-monotonic clocks. */ |
| if (unlikely(nstime_compare(&old_time, time) > 0)) { |
| nstime_copy(time, &old_time); |
| return (true); |
| } |
| |
| return (false); |
| } |
| #ifdef JEMALLOC_JET |
| #undef nstime_update |
| #define nstime_update JEMALLOC_N(nstime_update) |
| nstime_update_t *nstime_update = JEMALLOC_N(n_nstime_update); |
| #endif |