Export epoch time via proc_global_info (XCC)
[akaros.git] / tools / compilers / gcc-glibc / glibc-2.19-akaros / sysdeps / akaros / time.c
1 #include <time.h>
2 #include <stdbool.h>
3 #include <sys/time.h>
4 #include <parlib/timing.h>
5 #include <ros/procinfo.h>
6
7 time_t
8 time(time_t* p)
9 {
10   struct timeval t;
11   int ret = gettimeofday(&t,0);
12   if(ret == -1)
13     return (time_t)-1;
14
15   time_t ti = t.tv_sec;
16   if(p)
17     *p = ti;
18   return ti;
19 }
20 libc_hidden_def(time)
21
22 /* Adds normal timespecs */
23 void add_timespecs(struct timespec *sum, const struct timespec *x,
24                    const struct timespec *y)
25 {
26         bool plus_one = false;
27
28         sum->tv_nsec = x->tv_nsec + y->tv_nsec;
29         /* Overflow detection */
30         if (sum->tv_nsec / 1000000000) {
31                 sum->tv_nsec -= 1000000000;
32                 plus_one = true;
33         }
34         sum->tv_sec = x->tv_sec + y->tv_sec + (plus_one ? 1 : 0);
35 }
36
37 /* Subtracts normal timespecs */
38 void subtract_timespecs(struct timespec *diff, const struct timespec *minuend,
39                         const struct timespec *subtrahend)
40 {
41         unsigned long borrow_amt = 0;
42
43         if (minuend->tv_nsec < subtrahend->tv_nsec)
44                 borrow_amt = 1000000000;
45         diff->tv_nsec = borrow_amt + minuend->tv_nsec - subtrahend->tv_nsec;
46         diff->tv_sec = minuend->tv_sec - subtrahend->tv_sec - (borrow_amt ? 1 : 0);
47 }
48
49 /* Declared in parlib/timing.h */
50
51 uint64_t epoch_nsec_to_tsc(uint64_t epoch_ns)
52 {
53         return nsec2tsc(epoch_ns - __proc_global_info.walltime_ns_last) +
54                __proc_global_info.tsc_cycles_last;
55 }
56
57 uint64_t tsc_to_epoch_nsec(uint64_t tsc)
58 {
59         return tsc2nsec(tsc - __proc_global_info.tsc_cycles_last) +
60                __proc_global_info.walltime_ns_last;
61 }
62
63 uint64_t epoch_nsec(void)
64 {
65         /* in case we get called before the constructor.  it's a little racy, but
66          * this all happens when we're single threaded.  for those curious, this
67          * seems to happen a lot due to the proliferation of gettimeofday calls. */
68         return tsc_to_epoch_nsec(read_tsc());
69 }