# HG changeset patch # User Paul Eggert # Date 1353479107 28800 # Node ID fe213f3f2c570de4ff8b065baf6ab024ab3ef791 # Parent 3aff72f6c8ba2bb62102b0b1dcf88d2e4de2bbea 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. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,25 @@ 2012-11-29 Paul Eggert + 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. + wctype-h: better 'inline' * lib/wctype-h.c: New file. * lib/wctype.in.h (_GL_WCTYPE_INLINE): diff --git a/lib/gethrxtime.c b/lib/gethrxtime.c --- a/lib/gethrxtime.c +++ b/lib/gethrxtime.c @@ -19,8 +19,11 @@ #include +#define GETHRXTIME_INLINE _GL_EXTERN_INLINE #include "gethrxtime.h" +#if ! (HAVE_ARITHMETIC_HRTIME_T && HAVE_DECL_GETHRTIME) + #include #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 @@ gettime (&ts); return xtime_make (ts.tv_sec, ts.tv_nsec); } +# endif # endif +} + #endif -} diff --git a/lib/gethrxtime.h b/lib/gethrxtime.h --- 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 @@ high-resolution clock that is not subject to resetting or drifting. */ -# if HAVE_ARITHMETIC_HRTIME_T && HAVE_DECL_GETHRTIME -# include -static inline xtime_t gethrxtime (void) { return gethrtime (); } +#if HAVE_ARITHMETIC_HRTIME_T && HAVE_DECL_GETHRTIME +# include +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 --- /dev/null +++ b/lib/xtime.c @@ -0,0 +1,3 @@ +#include +#define XTIME_INLINE _GL_EXTERN_INLINE +#include "xtime.h" diff --git a/lib/xtime.h b/lib/xtime.h --- 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 +# define XTIME_PRECISION 1000000000 +#else +# include 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 @@ /* 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 @@ } /* 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 @@ } /* 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; diff --git a/m4/gethrxtime.m4 b/m4/gethrxtime.m4 --- a/m4/gethrxtime.m4 +++ b/m4/gethrxtime.m4 @@ -1,4 +1,4 @@ -# gethrxtime.m4 serial 11 +# gethrxtime.m4 serial 12 dnl Copyright (C) 2005-2006, 2008-2012 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -18,8 +18,10 @@ dnl Find libraries needed to link lib/gethrxtime.c. AC_REQUIRE([gl_CLOCK_TIME]) AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) - AC_CHECK_FUNCS_ONCE([nanouptime]) - if test $ac_cv_func_nanouptime != yes; then + AC_CHECK_FUNCS_ONCE([microuptime nanouptime]) + if test $ac_cv_func_nanouptime != yes \ + && { test $ac_cv_have_decl_gethrtime = no \ + || test $gl_cv_arithmetic_hrtime_t = no; }; then AC_CACHE_CHECK([whether CLOCK_MONOTONIC or CLOCK_REALTIME is defined], [gl_cv_have_clock_gettime_macro], [AC_EGREP_CPP([have_clock_gettime_macro], @@ -60,14 +62,6 @@ # Prerequisites of lib/xtime.h. AC_DEFUN([gl_XTIME], [ - AC_REQUIRE([AC_C_INLINE]) AC_REQUIRE([AC_TYPE_LONG_LONG_INT]) : ]) - -# Prerequisites of lib/gethrxtime.c. -AC_DEFUN([gl_PREREQ_GETHRXTIME], -[ - AC_CHECK_FUNCS_ONCE([microuptime]) - : -]) diff --git a/modules/gethrxtime b/modules/gethrxtime --- a/modules/gethrxtime +++ b/modules/gethrxtime @@ -3,6 +3,7 @@ Files: lib/xtime.h +lib/xtime.c lib/gethrxtime.c lib/gethrxtime.h m4/gethrxtime.m4 @@ -11,17 +12,15 @@ Depends-on: clock-time extensions +extern-inline gettime sys_time configure.ac: gl_GETHRXTIME -if test $ac_cv_have_decl_gethrtime = no || test $gl_cv_arithmetic_hrtime_t = no; then - AC_LIBOBJ([gethrxtime]) - gl_PREREQ_GETHRXTIME -fi Makefile.am: +lib_SOURCES += gethrxtime.c xtime.c Include: "xtime.h"