chiark / gitweb /
tests: add tests for environment serialization
[elogind.git] / src / basic / time-util.h
index eab708c2817e7450ceccfc123ca0da27534728a4..58b8c53006a6b4d753fbf5eb6814ce3c31567618 100644 (file)
 typedef uint64_t usec_t;
 typedef uint64_t nsec_t;
 
 typedef uint64_t usec_t;
 typedef uint64_t nsec_t;
 
-#define NSEC_FMT "%" PRIu64
-#define USEC_FMT "%" PRIu64
+#define PRI_NSEC PRIu64
+#define PRI_USEC PRIu64
+#define NSEC_FMT "%" PRI_NSEC
+#define USEC_FMT "%" PRI_USEC
 
 #include "macro.h"
 
 
 #include "macro.h"
 
@@ -159,6 +161,8 @@ bool clock_boottime_supported(void);
 bool clock_supported(clockid_t clock);
 #if 0 /// UNNEEDED by elogind
 clockid_t clock_boottime_or_monotonic(void);
 bool clock_supported(clockid_t clock);
 #if 0 /// UNNEEDED by elogind
 clockid_t clock_boottime_or_monotonic(void);
+
+usec_t usec_shift_clock(usec_t, clockid_t from, clockid_t to);
 #endif // 0
 
 #define xstrftime(buf, fmt, tm) \
 #endif // 0
 
 #define xstrftime(buf, fmt, tm) \
@@ -189,15 +193,30 @@ static inline usec_t usec_add(usec_t a, usec_t b) {
         return c;
 }
 
         return c;
 }
 
-static inline usec_t usec_sub(usec_t timestamp, int64_t delta) {
-        if (delta < 0)
-                return usec_add(timestamp, (usec_t) (-delta));
+static inline usec_t usec_sub_unsigned(usec_t timestamp, usec_t delta) {
 
         if (timestamp == USEC_INFINITY) /* Make sure infinity doesn't degrade */
                 return USEC_INFINITY;
 
         if (timestamp == USEC_INFINITY) /* Make sure infinity doesn't degrade */
                 return USEC_INFINITY;
-
-        if (timestamp < (usec_t) delta)
+        if (timestamp < delta)
                 return 0;
 
         return timestamp - delta;
 }
                 return 0;
 
         return timestamp - delta;
 }
+
+static inline usec_t usec_sub_signed(usec_t timestamp, int64_t delta) {
+        if (delta < 0)
+                return usec_add(timestamp, (usec_t) (-delta));
+        else
+                return usec_sub_unsigned(timestamp, (usec_t) delta);
+}
+
+#if SIZEOF_TIME_T == 8
+/* The last second we can format is 31. Dec 9999, 1s before midnight, because otherwise we'd enter 5 digit year
+ * territory. However, since we want to stay away from this in all timezones we take one day off. */
+#define USEC_TIMESTAMP_FORMATTABLE_MAX ((usec_t) 253402214399000000)
+#elif SIZEOF_TIME_T == 4
+/* With a 32bit time_t we can't go beyond 2038... */
+#define USEC_TIMESTAMP_FORMATTABLE_MAX ((usec_t) 2147483647000000)
+#else
+#error "Yuck, time_t is neither 4 not 8 bytes wide?"
+#endif