Add timespec helpers (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 8 Jun 2016 15:46:55 +0000 (11:46 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 17 Jun 2016 16:17:53 +0000 (12:17 -0400)
These are pretty useful.  I used them in timerfd, but now I'd like to
use them in other programs.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/Versions
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/time.c
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/time.h
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/time/time.h
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/timerfd.c

index a35e2e5..d36b2b1 100644 (file)
@@ -71,6 +71,8 @@ libc {
     timerfd_create;
     timerfd_settime;
     timerfd_gettime;
+    add_timespecs;
+    subtract_timespecs;
 
     # Weak symbols in parlib-compat.c
     __vcoreid;
index 28a308d..3aa0248 100644 (file)
@@ -1,4 +1,5 @@
 #include <time.h>
+#include <stdbool.h>
 #include <sys/time.h>
 
 time_t
@@ -15,3 +16,30 @@ time(time_t* p)
   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);
+}
index c856b58..d8427ea 100644 (file)
@@ -25,7 +25,7 @@
  *
  * Similar to bits/time.h, this includes various tidbits based on what
  * "__need"s are #defined.  Akaros's modification is to use our kernel header
- * for the struct timespec. */
+ * for the struct timespec and two helpers for working with timespecs. */
 
 #ifndef        _TIME_H
 
@@ -428,6 +428,12 @@ extern int getdate_r (const char *__restrict __string,
                      struct tm *__restrict __resbufp);
 # endif
 
+/* Akaros timespec helpers */
+void add_timespecs(struct timespec *sum, const struct timespec *x,
+                   const struct timespec *y);
+void subtract_timespecs(struct timespec *diff, const struct timespec *minuend,
+                        const struct timespec *subtrahend);
+
 __END_DECLS
 
 #endif /* <time.h> included.  */
index f7afcb8..5f0a6f7 100644 (file)
@@ -24,7 +24,7 @@
  *
  * Similar to bits/time.h, this includes various tidbits based on what
  * "__need"s are #defined.  Akaros's modification is to use our kernel header
- * for the struct timespec. */
+ * for the struct timespec and two helpers for working with timespecs. */
 
 #ifndef        _TIME_H
 
@@ -427,6 +427,12 @@ extern int getdate_r (const char *__restrict __string,
                      struct tm *__restrict __resbufp);
 # endif
 
+/* Akaros timespec helpers */
+void add_timespecs(struct timespec *sum, const struct timespec *x,
+                   const struct timespec *y);
+void subtract_timespecs(struct timespec *diff, const struct timespec *minuend,
+                        const struct timespec *subtrahend);
+
 __END_DECLS
 
 #endif /* <time.h> included.  */
index b467a36..093eb44 100644 (file)
@@ -57,33 +57,6 @@ static int set_timer(int timerfd, uint64_t abs_ticks)
        return write_hex_to_fd(timerfd, abs_ticks);
 }
 
-/* Helper: adds normal timespecs */
-static 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);
-}
-
-/* Helper: subtracts normal timespecs */
-static void sub_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);
-}
-
 static uint64_t timespec2tsc(const struct timespec *ts)
 {
        return nsec2tsc(ts->tv_sec * 1000000000ULL + ts->tv_nsec);
@@ -176,7 +149,7 @@ int timerfd_settime(int fd, int flags,
                ret = clock_gettime(CLOCK_MONOTONIC, &now_timespec);
                if (ret < 0)
                        goto out;
-               sub_timespecs(&rel_timespec, &new_value->it_value, &now_timespec);
+               subtract_timespecs(&rel_timespec, &new_value->it_value, &now_timespec);
        } else {
                rel_timespec = new_value->it_value;
        }