diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2012-11-20 22:25:07 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2012-11-29 23:38:52 -0800 |
commit | 691d7bd0ad1d0ba169776bc9ab6a983a8201848e (patch) | |
tree | 582b29c6e9bdc7bd28e6c2b7910dfcf3aadb6639 /lib | |
parent | 15b55826727e2010405953a370da01c59ab9ea0d (diff) | |
download | gnulib-691d7bd0ad1d0ba169776bc9ab6a983a8201848e.tar.gz |
gethrxtime: better 'inline'
* lib/xtime.c: New file.
* lib/gethrxtime.c, lib/gethrxtime.h (GETHRXTIME_INLINE):
* lib/xtime.h (XTIME_INCLUDE):
New macros. Replace all uses of 'static inline' with them.
* lib/gethrxtime.c (gethrxtime): Define only if
! (HAVE_ARITHMETIC_HRTIME_T && HAVE_DECL_GETHRTIME), since
this source file is now always compiled, because of the extern inline.
* lib/gethrxtime.h, lib/xtime.h:
Use _GL_INLINE_HEADER_BEGIN, _GL_INLINE_HEADER_END.
* m4/gethrxtime.m4 (gl_GETHRXTIME): Do not check for clock macros
if gethrtime works, as they're not needed in that case.
(gl_XTIME): Do not require AC_C_INLINE.
(gl_PREREQ_GETHRXTIME): Remove; all uses removed, as it's always
compiled now. Move the check into gl_GETHRXTIME.
* modules/gethrxtime (Files, lib_SOURCES): Add lib/xtime.c.
(Depends-on): Add extern-inline.
(configure.ac): gethrxtime is always compiled now.
(lib_SOURCES): Add gethrxtime.c.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gethrxtime.c | 19 | ||||
-rw-r--r-- | lib/gethrxtime.h | 19 | ||||
-rw-r--r-- | lib/xtime.c | 3 | ||||
-rw-r--r-- | lib/xtime.h | 35 |
4 files changed, 48 insertions, 28 deletions
diff --git a/lib/gethrxtime.c b/lib/gethrxtime.c index 6e0263d6f0..bd0628a1cf 100644 --- a/lib/gethrxtime.c +++ b/lib/gethrxtime.c @@ -19,8 +19,11 @@ #include <config.h> +#define GETHRXTIME_INLINE _GL_EXTERN_INLINE #include "gethrxtime.h" +#if ! (HAVE_ARITHMETIC_HRTIME_T && HAVE_DECL_GETHRTIME) + #include <sys/time.h> #include "timespec.h" @@ -32,30 +35,30 @@ xtime_t gethrxtime (void) { -#if HAVE_NANOUPTIME +# if HAVE_NANOUPTIME { struct timespec ts; nanouptime (&ts); return xtime_make (ts.tv_sec, ts.tv_nsec); } -#else +# else -# if defined CLOCK_MONOTONIC && HAVE_CLOCK_GETTIME +# if defined CLOCK_MONOTONIC && HAVE_CLOCK_GETTIME { struct timespec ts; if (clock_gettime (CLOCK_MONOTONIC, &ts) == 0) return xtime_make (ts.tv_sec, ts.tv_nsec); } -# endif +# endif -# if HAVE_MICROUPTIME +# if HAVE_MICROUPTIME { struct timeval tv; microuptime (&tv); return xtime_make (tv.tv_sec, 1000 * tv.tv_usec); } -# else +# else /* No monotonically increasing clocks are available; fall back on a clock that might jump backwards, since it's the best we can do. */ { @@ -63,6 +66,8 @@ gethrxtime (void) gettime (&ts); return xtime_make (ts.tv_sec, ts.tv_nsec); } +# endif # endif -#endif } + +#endif diff --git a/lib/gethrxtime.h b/lib/gethrxtime.h index 9453d609e3..1b81527dc5 100644 --- a/lib/gethrxtime.h +++ b/lib/gethrxtime.h @@ -18,9 +18,14 @@ /* Written by Paul Eggert. */ #ifndef GETHRXTIME_H_ -# define GETHRXTIME_H_ 1 +#define GETHRXTIME_H_ 1 -# include "xtime.h" +#include "xtime.h" + +_GL_INLINE_HEADER_BEGIN +#ifndef GETHRXTIME_INLINE +# define GETHRXTIME_INLINE _GL_INLINE +#endif #ifdef __cplusplus extern "C" { @@ -31,12 +36,14 @@ extern "C" { high-resolution clock that is not subject to resetting or drifting. */ -# if HAVE_ARITHMETIC_HRTIME_T && HAVE_DECL_GETHRTIME -# include <time.h> -static inline xtime_t gethrxtime (void) { return gethrtime (); } +#if HAVE_ARITHMETIC_HRTIME_T && HAVE_DECL_GETHRTIME +# include <time.h> +GETHRXTIME_INLINE xtime_t gethrxtime (void) { return gethrtime (); } # else xtime_t gethrxtime (void); -# endif +#endif + +_GL_INLINE_HEADER_END #ifdef __cplusplus } diff --git a/lib/xtime.c b/lib/xtime.c new file mode 100644 index 0000000000..e608f69fdf --- /dev/null +++ b/lib/xtime.c @@ -0,0 +1,3 @@ +#include <config.h> +#define XTIME_INLINE _GL_EXTERN_INLINE +#include "xtime.h" diff --git a/lib/xtime.h b/lib/xtime.h index 3d235faba8..544841f57c 100644 --- a/lib/xtime.h +++ b/lib/xtime.h @@ -18,24 +18,29 @@ /* Written by Paul Eggert. */ #ifndef XTIME_H_ -# define XTIME_H_ 1 +#define XTIME_H_ 1 + +_GL_INLINE_HEADER_BEGIN +#ifndef XTIME_INLINE +# define XTIME_INLINE _GL_INLINE +#endif /* xtime_t is a signed type used for time stamps. It is an integer type that is a count of nanoseconds -- except for obsolescent hosts without sufficiently-wide integers, where it is a count of seconds. */ -# if HAVE_LONG_LONG_INT +#if HAVE_LONG_LONG_INT typedef long long int xtime_t; -# define XTIME_PRECISION 1000000000 -# else -# include <limits.h> +# define XTIME_PRECISION 1000000000 +#else +# include <limits.h> typedef long int xtime_t; -# if LONG_MAX >> 31 >> 31 == 0 -# define XTIME_PRECISION 1 -# else -# define XTIME_PRECISION 1000000000 -# endif +# if LONG_MAX >> 31 >> 31 == 0 +# define XTIME_PRECISION 1 +# else +# define XTIME_PRECISION 1000000000 # endif +#endif #ifdef __cplusplus extern "C" { @@ -43,7 +48,7 @@ extern "C" { /* Return an extended time value that contains S seconds and NS nanoseconds, without any overflow checking. */ -static inline xtime_t +XTIME_INLINE xtime_t xtime_make (xtime_t s, long int ns) { if (XTIME_PRECISION == 1) @@ -53,14 +58,14 @@ xtime_make (xtime_t s, long int ns) } /* Return the number of seconds in T, which must be nonnegative. */ -static inline xtime_t +XTIME_INLINE xtime_t xtime_nonnegative_sec (xtime_t t) { return t / XTIME_PRECISION; } /* Return the number of seconds in T. */ -static inline xtime_t +XTIME_INLINE xtime_t xtime_sec (xtime_t t) { return (XTIME_PRECISION == 1 @@ -71,14 +76,14 @@ xtime_sec (xtime_t t) } /* Return the number of nanoseconds in T, which must be nonnegative. */ -static inline long int +XTIME_INLINE long int xtime_nonnegative_nsec (xtime_t t) { return t % XTIME_PRECISION; } /* Return the number of nanoseconds in T. */ -static inline long int +XTIME_INLINE long int xtime_nsec (xtime_t t) { long int ns = t % XTIME_PRECISION; |