1 #ifndef JEMALLOC_INTERNAL_NSTIME_H 2 #define JEMALLOC_INTERNAL_NSTIME_H 3 4 /* Maximum supported number of seconds (~584 years). */ 5 #define NSTIME_SEC_MAX KQU(18446744072) 6 7 #define NSTIME_MAGIC ((uint32_t)0xb8a9ce37) 8 #ifdef JEMALLOC_DEBUG 9 # define NSTIME_ZERO_INITIALIZER {0, NSTIME_MAGIC} 10 #else 11 # define NSTIME_ZERO_INITIALIZER {0} 12 #endif 13 14 typedef struct { 15 uint64_t ns; 16 #ifdef JEMALLOC_DEBUG 17 uint32_t magic; /* Tracks if initialized. */ 18 #endif 19 } nstime_t; 20 21 static const nstime_t nstime_zero = NSTIME_ZERO_INITIALIZER; 22 23 void nstime_init(nstime_t *time, uint64_t ns); 24 void nstime_init2(nstime_t *time, uint64_t sec, uint64_t nsec); 25 uint64_t nstime_ns(const nstime_t *time); 26 uint64_t nstime_sec(const nstime_t *time); 27 uint64_t nstime_msec(const nstime_t *time); 28 uint64_t nstime_nsec(const nstime_t *time); 29 void nstime_copy(nstime_t *time, const nstime_t *source); 30 int nstime_compare(const nstime_t *a, const nstime_t *b); 31 void nstime_add(nstime_t *time, const nstime_t *addend); 32 void nstime_iadd(nstime_t *time, uint64_t addend); 33 void nstime_subtract(nstime_t *time, const nstime_t *subtrahend); 34 void nstime_isubtract(nstime_t *time, uint64_t subtrahend); 35 void nstime_imultiply(nstime_t *time, uint64_t multiplier); 36 void nstime_idivide(nstime_t *time, uint64_t divisor); 37 uint64_t nstime_divide(const nstime_t *time, const nstime_t *divisor); 38 uint64_t nstime_ns_since(const nstime_t *past); 39 40 typedef bool (nstime_monotonic_t)(void); 41 extern nstime_monotonic_t *JET_MUTABLE nstime_monotonic; 42 43 typedef void (nstime_update_t)(nstime_t *); 44 extern nstime_update_t *JET_MUTABLE nstime_update; 45 46 typedef void (nstime_prof_update_t)(nstime_t *); 47 extern nstime_prof_update_t *JET_MUTABLE nstime_prof_update; 48 49 void nstime_init_update(nstime_t *time); 50 void nstime_prof_init_update(nstime_t *time); 51 52 enum prof_time_res_e { 53 prof_time_res_default = 0, 54 prof_time_res_high = 1 55 }; 56 typedef enum prof_time_res_e prof_time_res_t; 57 58 extern prof_time_res_t opt_prof_time_res; 59 extern const char *prof_time_res_mode_names[]; 60 61 JEMALLOC_ALWAYS_INLINE void 62 nstime_init_zero(nstime_t *time) { 63 nstime_copy(time, &nstime_zero); 64 } 65 66 JEMALLOC_ALWAYS_INLINE bool 67 nstime_equals_zero(nstime_t *time) { 68 int diff = nstime_compare(time, &nstime_zero); 69 assert(diff >= 0); 70 return diff == 0; 71 } 72 73 #endif /* JEMALLOC_INTERNAL_NSTIME_H */ 74