From 40caf0ad9bef07bdfb568a88192c157dd1840100 Mon Sep 17 00:00:00 2001 From: "David M. Lee" Date: Fri, 24 Jul 2015 17:04:35 -0500 Subject: Replaces clock_gettime() with ast_tsnow() clock_gettime() is, unfortunately, not portable. But I did like that over our usual `ts.tv_nsec = tv.tv_usec * 1000` copy/paste code we usually do when we want a timespec and all we have is ast_tvnow(). This patch adds ast_tsnow(), which mimics ast_tvnow(), but returns a timespec. If clock_gettime() is available, it will use that. Otherwise ast_tsnow() falls back to using ast_tvnow(). Change-Id: Ibb1ee67ccf4826b9b76d5a5eb62e90b29b6c456e --- include/asterisk/autoconfig.h.in | 3 +++ include/asterisk/time.h | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) (limited to 'include/asterisk') diff --git a/include/asterisk/autoconfig.h.in b/include/asterisk/autoconfig.h.in index 6b41a8c9a..c0c34736b 100644 --- a/include/asterisk/autoconfig.h.in +++ b/include/asterisk/autoconfig.h.in @@ -764,6 +764,9 @@ /* Define to 1 if you have the `roundl' function. */ #undef HAVE_ROUNDL +/* Define to 1 if rt has the Realtime functions feature. */ +#undef HAVE_RT + /* Define if your system has the RTLD_NOLOAD headers. */ #undef HAVE_RTLD_NOLOAD diff --git a/include/asterisk/time.h b/include/asterisk/time.h index f2382df33..529490630 100644 --- a/include/asterisk/time.h +++ b/include/asterisk/time.h @@ -23,10 +23,16 @@ #ifndef _ASTERISK_TIME_H #define _ASTERISK_TIME_H +#include "asterisk/autoconfig.h" + #ifdef HAVE_SYS_TIME_H #include #endif +#ifdef HAVE_UNISTD_H +#include +#endif + #include "asterisk/inline_api.h" /* We have to let the compiler learn what types to use for the elements of a @@ -141,6 +147,34 @@ struct timeval ast_tvnow(void), } ) +/*! + * \brief Returns current timespec. Meant to avoid calling ast_tvnow() just to + * create a timespec from the timeval it returns. + */ +#if defined _POSIX_TIMERS && _POSIX_TIMERS > 0 +AST_INLINE_API( +struct timespec ast_tsnow(void), +{ + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + return ts; +} +) +#else +AST_INLINE_API( +struct timespec ast_tsnow(void), +{ + struct timeval tv = ast_tvnow(); + struct timespec ts; + /* Can't use designated initializer, because it does odd things with + * the AST_INLINE_API macro. Go figure. */ + ts.tv_sec = tv.tv_sec; + ts.tv_nsec = tv.tv_usec * 1000; + return ts; +} +) +#endif + /*! * \brief Returns the sum of two timevals a + b */ -- cgit v1.2.3