core: Add timespec helper macros and make timer_compat.h public

If a monotonic clock must be used, then the clock_gettime API is used
which uses timespec structures. Linux systems by default don't provide
helpers to calculate time using timespecs, so let's add them here.

Let's also make this header public so these helpers can be used in other
projects using libosmocore (expected user: libosmo-netif).

Change-Id: I45fc993b9bb0a343763238bf463c8640f47b00f1
changes/48/6948/2
Pau Espin 2018-02-26 18:03:44 +01:00 committed by Harald Welte
parent cc81722736
commit 726ba36201
2 changed files with 45 additions and 1 deletions

View File

@ -47,6 +47,7 @@ nobase_include_HEADERS = \
osmocom/core/strrb.h \
osmocom/core/talloc.h \
osmocom/core/timer.h \
osmocom/core/timer_compat.h \
osmocom/core/utils.h \
osmocom/core/write_queue.h \
osmocom/crypt/auth.h \
@ -148,7 +149,6 @@ nobase_include_HEADERS += \
endif
noinst_HEADERS = \
osmocom/core/timer_compat.h \
osmocom/gsm/kasumi.h osmocom/gsm/gea.h
osmocom/core/bit%gen.h: osmocom/core/bitXXgen.h.tpl

View File

@ -71,5 +71,49 @@
} while (0)
#endif
/* Convenience macros for operations on timespecs.
NOTE: `timercmp' does not work for >= or <=. */
#ifndef timespecisset
# define timespecisset(tvp) ((tvp)->tv_sec || (tvp)->tv_nsec)
#endif
#ifndef timespecclear
# define timespecclear(tvp) ((tvp)->tv_sec = (tvp)->tv_nsec = 0)
#endif
#ifndef timespeccmp
# define timespeccmp(a, b, CMP) \
(((a)->tv_sec == (b)->tv_sec) ? \
((a)->tv_nsec CMP (b)->tv_nsec) : \
((a)->tv_sec CMP (b)->tv_sec))
#endif
#ifndef timespecadd
# define timespecadd(a, b, result) \
do { \
(result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \
(result)->tv_nsec = (a)->tv_nsec + (b)->tv_nsec; \
if ((result)->tv_nsec >= 1000000000) \
{ \
++(result)->tv_sec; \
(result)->tv_nsec -= 1000000000; \
} \
} while (0)
#endif
#ifndef timespecsub
# define timespecsub(a, b, result) \
do { \
(result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
(result)->tv_nsec = (a)->tv_nsec - (b)->tv_nsec; \
if ((result)->tv_nsec < 0) { \
--(result)->tv_sec; \
(result)->tv_nsec += 1000000000; \
} \
} while (0)
#endif
/*! @} */