+/** @brief Return the sum of two timespecs */
+static inline struct timespec tsadd(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_nsec += 1000000;
+ r.tv_sec--;
+ }
+ if(r.tv_nsec > 999999) {
+ r.tv_nsec -= 1000000;
+ r.tv_sec++;
+ }
+ return r;
+}
+
+/** @brief Subtract one timespec from another */
+static inline struct timespec tssub(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_nsec += 1000000;
+ r.tv_sec--;
+ }
+ if(r.tv_nsec > 999999) {
+ r.tv_nsec -= 1000000;
+ r.tv_sec++;
+ }
+ return r;
+}
+
+/** @brief Convert a timespec to a double */
+static inline double ts_to_double(const struct timespec ts) {
+ return ts.tv_sec + ts.tv_nsec / 1000000000.0;
+}
+
+/** @brief Convert a double to a timespec */
+static inline struct timespec double_to_ts(double n) {
+ double i, f;
+ struct timespec r;
+ f = modf(n, &i);
+ r.tv_sec = i;
+ r.tv_nsec = 1000000000 * f;
+ return r;
+}
+