Home | History | Annotate | Line # | Download | only in internal
      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