|  | #include <time.h> | 
|  | #include <stdbool.h> | 
|  | #include <sys/time.h> | 
|  | #include <parlib/timing.h> | 
|  | #include <ros/procinfo.h> | 
|  |  | 
|  | time_t | 
|  | time(time_t* p) | 
|  | { | 
|  | struct timeval t; | 
|  | int ret = gettimeofday(&t,0); | 
|  | if(ret == -1) | 
|  | return (time_t)-1; | 
|  |  | 
|  | time_t ti = t.tv_sec; | 
|  | if(p) | 
|  | *p = ti; | 
|  | return ti; | 
|  | } | 
|  | libc_hidden_def(time) | 
|  |  | 
|  | /* Adds normal timespecs */ | 
|  | void add_timespecs(struct timespec *sum, const struct timespec *x, | 
|  | const struct timespec *y) | 
|  | { | 
|  | bool plus_one = false; | 
|  |  | 
|  | sum->tv_nsec = x->tv_nsec + y->tv_nsec; | 
|  | /* Overflow detection */ | 
|  | if (sum->tv_nsec / 1000000000) { | 
|  | sum->tv_nsec -= 1000000000; | 
|  | plus_one = true; | 
|  | } | 
|  | sum->tv_sec = x->tv_sec + y->tv_sec + (plus_one ? 1 : 0); | 
|  | } | 
|  |  | 
|  | /* Subtracts normal timespecs */ | 
|  | void subtract_timespecs(struct timespec *diff, const struct timespec *minuend, | 
|  | const struct timespec *subtrahend) | 
|  | { | 
|  | unsigned long borrow_amt = 0; | 
|  |  | 
|  | if (minuend->tv_nsec < subtrahend->tv_nsec) | 
|  | borrow_amt = 1000000000; | 
|  | diff->tv_nsec = borrow_amt + minuend->tv_nsec - subtrahend->tv_nsec; | 
|  | diff->tv_sec = minuend->tv_sec - subtrahend->tv_sec | 
|  | - (borrow_amt ? 1 : 0); | 
|  | } | 
|  |  | 
|  | /* Declared in parlib/timing.h */ | 
|  |  | 
|  | uint64_t epoch_nsec_to_tsc(uint64_t epoch_ns) | 
|  | { | 
|  | return nsec2tsc(epoch_ns - __proc_global_info.walltime_ns_last) + | 
|  | __proc_global_info.tsc_cycles_last; | 
|  | } | 
|  |  | 
|  | uint64_t tsc_to_epoch_nsec(uint64_t tsc) | 
|  | { | 
|  | return tsc2nsec(tsc - __proc_global_info.tsc_cycles_last) + | 
|  | __proc_global_info.walltime_ns_last; | 
|  | } | 
|  |  | 
|  | uint64_t epoch_nsec(void) | 
|  | { | 
|  | /* in case we get called before the constructor.  it's a little racy, | 
|  | * but this all happens when we're single threaded.  for those curious, | 
|  | * this seems to happen a lot due to the proliferation of gettimeofday | 
|  | * calls. */ | 
|  | return tsc_to_epoch_nsec(read_tsc()); | 
|  | } |