| #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()); |
| } |