+#ifndef EVENT_CLOCK
+#if defined(CLOCK_MONOTONIC_RAW) && defined(__x86_64__)
+#define EVENT_CLOCK CLOCK_MONOTONIC_RAW
+#else
+#define EVENT_CLOCK CLOCK_MONOTONIC
+#endif
+#endif
+
+static void timespec_add(const struct timespec *a, const struct timespec *b, struct timespec *r) {
+ r->tv_sec = a->tv_sec + b->tv_sec;
+ r->tv_nsec = a->tv_nsec + b->tv_nsec;
+
+ if(r->tv_nsec > 1000000000) {
+ r->tv_sec++, r->tv_nsec -= 1000000000;
+ }
+}
+
+static void timespec_sub(const struct timespec *a, const struct timespec *b, struct timespec *r) {
+ r->tv_sec = a->tv_sec - b->tv_sec;
+ r->tv_nsec = a->tv_nsec - b->tv_nsec;
+
+ if(r->tv_nsec < 0) {
+ r->tv_sec--, r->tv_nsec += 1000000000;
+ }
+}
+
+static bool timespec_lt(const struct timespec *a, const struct timespec *b) {
+ if(a->tv_sec == b->tv_sec) {
+ return a->tv_nsec < b->tv_nsec;
+ } else {
+ return a->tv_sec < b->tv_sec;
+ }
+}
+
+static void timespec_clear(struct timespec *a) {
+ a->tv_sec = 0;
+}
+