summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2012-11-20 22:25:07 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2012-11-29 23:38:52 -0800
commit691d7bd0ad1d0ba169776bc9ab6a983a8201848e (patch)
tree582b29c6e9bdc7bd28e6c2b7910dfcf3aadb6639 /lib
parent15b55826727e2010405953a370da01c59ab9ea0d (diff)
downloadgnulib-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.c19
-rw-r--r--lib/gethrxtime.h19
-rw-r--r--lib/xtime.c3
-rw-r--r--lib/xtime.h35
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;