3aa0248c736378773413c315573a9de101889c89
[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
5 time_t
6 time(time_t* p)
7 {
8   struct timeval t;
9   int ret = gettimeofday(&t,0);
10   if(ret == -1)
11     return (time_t)-1;
12
13   time_t ti = t.tv_sec;
14   if(p)
15     *p = ti;
16   return ti;
17 }
18 libc_hidden_def(time)
19
20 /* Adds normal timespecs */
21 void add_timespecs(struct timespec *sum, const struct timespec *x,
22                    const struct timespec *y)
23 {
24         bool plus_one = false;
25
26         sum->tv_nsec = x->tv_nsec + y->tv_nsec;
27         /* Overflow detection */
28         if (sum->tv_nsec / 1000000000) {
29                 sum->tv_nsec -= 1000000000;
30                 plus_one = true;
31         }
32         sum->tv_sec = x->tv_sec + y->tv_sec + (plus_one ? 1 : 0);
33 }
34
35 /* Subtracts normal timespecs */
36 void subtract_timespecs(struct timespec *diff, const struct timespec *minuend,
37                         const struct timespec *subtrahend)
38 {
39         unsigned long borrow_amt = 0;
40
41         if (minuend->tv_nsec < subtrahend->tv_nsec)
42                 borrow_amt = 1000000000;
43         diff->tv_nsec = borrow_amt + minuend->tv_nsec - subtrahend->tv_nsec;
44         diff->tv_sec = minuend->tv_sec - subtrahend->tv_sec - (borrow_amt ? 1 : 0);
45 }