Commit 75631973 authored by Alexandre Duret-Lutz's avatar Alexandre Duret-Lutz
Browse files

Import the gethrxtime module from gnulib.

gnulib 9e117ae955a5c6a0406140e62b76c3ef50e3bc2b.

* lib/gethrxtime.c, lib/gethrxtime.h, lib/gettime.c, lib/timespec.c,
lib/timespec.h, lib/xtime.h, m4/clock_time.m4, m4/gethrxtime.m4,
m4/gettime.m4, m4/timespec.m4: New files.
* m4/gnulib-cache.m4, m4/gnulib-comp.m4, lib/Makefile.am: Adjust.
parent d7e8684d
......@@ -21,7 +21,7 @@
# the same distribution terms as the rest of that program.
#
# Generated by gnulib-tool.
# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=tools --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files --no-libtool --no-vc-files argp error mkstemp progname
# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=tools --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files --no-libtool --no-vc-files argp error gethrxtime mkstemp progname
AUTOMAKE_OPTIONS = 1.5 gnits
......@@ -215,6 +215,15 @@ EXTRA_libgnu_a_SOURCES += float.c itold.c
## end gnulib module float
## begin gnulib module gethrxtime
EXTRA_DIST += gethrxtime.c gethrxtime.h xtime.h
EXTRA_libgnu_a_SOURCES += gethrxtime.c
## end gnulib module gethrxtime
## begin gnulib module getopt-posix
BUILT_SOURCES += $(GETOPT_H)
......@@ -248,6 +257,12 @@ libgnu_a_SOURCES += gettext.h
## end gnulib module gettext-h
## begin gnulib module gettime
libgnu_a_SOURCES += gettime.c
## end gnulib module gettime
## begin gnulib module gettimeofday
......@@ -1202,6 +1217,14 @@ EXTRA_DIST += time.in.h
## end gnulib module time
## begin gnulib module timespec
libgnu_a_SOURCES += timespec.c
EXTRA_DIST += timespec.h
## end gnulib module timespec
## begin gnulib module unistd
BUILT_SOURCES += unistd.h
......
/* gethrxtime -- get high resolution real time
Copyright (C) 2005-2007, 2009-2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* Written by Paul Eggert. */
#include <config.h>
#include "gethrxtime.h"
#include <sys/time.h>
#include "timespec.h"
/* Get the current time, as a count of the number of nanoseconds since
an arbitrary epoch (e.g., the system boot time). Prefer a
high-resolution clock that is not subject to resetting or
drifting. */
xtime_t
gethrxtime (void)
{
#if HAVE_NANOUPTIME
{
struct timespec ts;
nanouptime (&ts);
return xtime_make (ts.tv_sec, ts.tv_nsec);
}
#else
# 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
# if HAVE_MICROUPTIME
{
struct timeval tv;
microuptime (&tv);
return xtime_make (tv.tv_sec, 1000 * tv.tv_usec);
}
# else
/* No monotonically increasing clocks are available; fall back on a
clock that might jump backwards, since it's the best we can do. */
{
struct timespec ts;
gettime (&ts);
return xtime_make (ts.tv_sec, ts.tv_nsec);
}
# endif
#endif
}
/* gethrxtime -- get high resolution real time
Copyright (C) 2005, 2009-2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* Written by Paul Eggert. */
#ifndef GETHRXTIME_H_
# define GETHRXTIME_H_ 1
# include "xtime.h"
/* Get the current time, as a count of the number of nanoseconds since
an arbitrary epoch (e.g., the system boot time). Prefer a
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 (); }
# else
xtime_t gethrxtime (void);
# endif
#endif
/* gettime -- get the system clock
Copyright (C) 2002, 2004-2007, 2009-2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* Written by Paul Eggert. */
#include <config.h>
#include "timespec.h"
#include <sys/time.h>
/* Get the system time into *TS. */
void
gettime (struct timespec *ts)
{
#if HAVE_NANOTIME
nanotime (ts);
#else
# if defined CLOCK_REALTIME && HAVE_CLOCK_GETTIME
if (clock_gettime (CLOCK_REALTIME, ts) == 0)
return;
# endif
{
struct timeval tv;
gettimeofday (&tv, NULL);
ts->tv_sec = tv.tv_sec;
ts->tv_nsec = tv.tv_usec * 1000;
}
#endif
}
#include <config.h>
#define _GL_TIMESPEC_INLINE _GL_EXTERN_INLINE
#include "timespec.h"
/* timespec -- System time interface
Copyright (C) 2000, 2002, 2004-2005, 2007, 2009-2012 Free Software
Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#if ! defined TIMESPEC_H
# define TIMESPEC_H
# include <time.h>
_GL_INLINE_HEADER_BEGIN
#ifndef _GL_TIMESPEC_INLINE
# define _GL_TIMESPEC_INLINE _GL_INLINE
#endif
/* Return negative, zero, positive if A < B, A == B, A > B, respectively.
For each time stamp T, this code assumes that either:
* T.tv_nsec is in the range 0..999999999; or
* T.tv_sec corresponds to a valid leap second on a host that supports
leap seconds, and T.tv_nsec is in the range 1000000000..1999999999; or
* T.tv_sec is the minimum time_t value and T.tv_nsec is -1; or
T.tv_sec is the maximum time_t value and T.tv_nsec is 2000000000.
This allows for special struct timespec values that are less or
greater than all possible valid time stamps.
In all these cases, it is safe to subtract two tv_nsec values and
convert the result to integer without worrying about overflow on
any platform of interest to the GNU project, since all such
platforms have 32-bit int or wider.
Replacing "(int) (a.tv_nsec - b.tv_nsec)" with something like
"a.tv_nsec < b.tv_nsec ? -1 : a.tv_nsec > b.tv_nsec" would cause
this function to work in some cases where the above assumption is
violated, but not in all cases (e.g., a.tv_sec==1, a.tv_nsec==-2,
b.tv_sec==0, b.tv_nsec==999999999) and is arguably not worth the
extra instructions. Using a subtraction has the advantage of
detecting some invalid cases on platforms that detect integer
overflow.
The (int) cast avoids a gcc -Wconversion warning. */
_GL_TIMESPEC_INLINE int
timespec_cmp (struct timespec a, struct timespec b)
{
return (a.tv_sec < b.tv_sec ? -1
: a.tv_sec > b.tv_sec ? 1
: (int) (a.tv_nsec - b.tv_nsec));
}
/* Return -1, 0, 1, depending on the sign of A. A.tv_nsec must be
nonnegative. */
_GL_TIMESPEC_INLINE int
timespec_sign (struct timespec a)
{
return a.tv_sec < 0 ? -1 : a.tv_sec || a.tv_nsec;
}
struct timespec timespec_add (struct timespec, struct timespec)
_GL_ATTRIBUTE_CONST;
struct timespec timespec_sub (struct timespec, struct timespec)
_GL_ATTRIBUTE_CONST;
struct timespec dtotimespec (double)
_GL_ATTRIBUTE_CONST;
/* Return an approximation to A, of type 'double'. */
_GL_TIMESPEC_INLINE double
timespectod (struct timespec a)
{
return a.tv_sec + a.tv_nsec / 1e9;
}
void gettime (struct timespec *);
int settime (struct timespec const *);
_GL_INLINE_HEADER_END
#endif
/* xtime -- extended-resolution integer time stamps
Copyright (C) 2005-2006, 2009-2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* Written by Paul Eggert. */
#ifndef XTIME_H_
# define XTIME_H_ 1
/* 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
typedef long long int xtime_t;
# 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
# endif
/* Return an extended time value that contains S seconds and NS
nanoseconds, without any overflow checking. */
static inline xtime_t
xtime_make (xtime_t s, long int ns)
{
if (XTIME_PRECISION == 1)
return s;
else
return XTIME_PRECISION * s + ns;
}
/* Return the number of seconds in T, which must be nonnegative. */
static 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_sec (xtime_t t)
{
return (XTIME_PRECISION == 1
? t
: t < 0
? (t + XTIME_PRECISION - 1) / XTIME_PRECISION - 1
: xtime_nonnegative_sec (t));
}
/* Return the number of nanoseconds in T, which must be nonnegative. */
static 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_nsec (xtime_t t)
{
long int ns = t % XTIME_PRECISION;
if (ns < 0)
ns += XTIME_PRECISION;
return ns;
}
#endif
# clock_time.m4 serial 10
dnl Copyright (C) 2002-2006, 2009-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,
dnl with or without modifications, as long as this notice is preserved.
# Check for clock_gettime and clock_settime, and set LIB_CLOCK_GETTIME.
# For a program named, say foo, you should add a line like the following
# in the corresponding Makefile.am file:
# foo_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME)
AC_DEFUN([gl_CLOCK_TIME],
[
dnl Persuade glibc and Solaris <time.h> to declare these functions.
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
# Solaris 2.5.1 needs -lposix4 to get the clock_gettime function.
# Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
# Save and restore LIBS so e.g., -lrt, isn't added to it. Otherwise, *all*
# programs in the package would end up linked with that potentially-shared
# library, inducing unnecessary run-time overhead.
LIB_CLOCK_GETTIME=
AC_SUBST([LIB_CLOCK_GETTIME])
gl_saved_libs=$LIBS
AC_SEARCH_LIBS([clock_gettime], [rt posix4],
[test "$ac_cv_search_clock_gettime" = "none required" ||
LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime])
AC_CHECK_FUNCS([clock_gettime clock_settime])
LIBS=$gl_saved_libs
])
# gethrxtime.m4 serial 11
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,
dnl with or without modifications, as long as this notice is preserved.
dnl Written by Paul Eggert.
AC_DEFUN([gl_GETHRXTIME],
[
AC_REQUIRE([gl_ARITHMETIC_HRTIME_T])
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
AC_REQUIRE([gl_XTIME])
AC_CHECK_DECLS([gethrtime], [], [], [[#include <time.h>]])
LIB_GETHRXTIME=
if test $ac_cv_have_decl_gethrtime = no \
|| test $gl_cv_arithmetic_hrtime_t = no; then
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_CACHE_CHECK([whether CLOCK_MONOTONIC or CLOCK_REALTIME is defined],
[gl_cv_have_clock_gettime_macro],
[AC_EGREP_CPP([have_clock_gettime_macro],
[
# include <time.h>
# if defined CLOCK_MONOTONIC || defined CLOCK_REALTIME
have_clock_gettime_macro
# endif
],
[gl_cv_have_clock_gettime_macro=yes],
[gl_cv_have_clock_gettime_macro=no])])
if test $gl_cv_have_clock_gettime_macro = yes; then
LIB_GETHRXTIME=$LIB_CLOCK_GETTIME
fi
fi
fi
AC_SUBST([LIB_GETHRXTIME])
])
# Test whether hrtime_t is an arithmetic type.
# It is not arithmetic in older Solaris c89 (which insists on
# not having a long long int type).
AC_DEFUN([gl_ARITHMETIC_HRTIME_T],
[
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
AC_CACHE_CHECK([for arithmetic hrtime_t], [gl_cv_arithmetic_hrtime_t],
[AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([[#include <time.h>]],
[[hrtime_t x = 0; return x/x;]])],
[gl_cv_arithmetic_hrtime_t=yes],
[gl_cv_arithmetic_hrtime_t=no])])
if test $gl_cv_arithmetic_hrtime_t = yes; then
AC_DEFINE([HAVE_ARITHMETIC_HRTIME_T], [1],
[Define if you have an arithmetic hrtime_t type.])
fi
])
# 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])
:
])
# gettime.m4 serial 8
dnl Copyright (C) 2002, 2004-2006, 2009-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,
dnl with or without modifications, as long as this notice is preserved.
AC_DEFUN([gl_GETTIME],
[
dnl Prerequisites of lib/gettime.c.
AC_REQUIRE([gl_CLOCK_TIME])
AC_REQUIRE([gl_TIMESPEC])
AC_CHECK_FUNCS_ONCE([gettimeofday nanotime])
])
......@@ -27,7 +27,7 @@
# Specification in the form of a command-line invocation:
# gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=tools --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files --no-libtool --no-vc-files argp error mkstemp progname
# gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=tools --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files --no-libtool --no-vc-files argp error gethrxtime mkstemp progname
# Specification in the form of a few gnulib-tool.m4 macro invocations:
gl_LOCAL_DIR([])
......@@ -36,6 +36,7 @@ gl_MODULES([
--no-vc-files
argp
error
gethrxtime
mkstemp
progname
])
......
......@@ -41,6 +41,7 @@ AC_DEFUN([gl_EARLY],
# Code from module alloca:
# Code from module alloca-opt:
# Code from module argp:
# Code from module clock-time:
# Code from module dirname-lgpl:
# Code from module dosname:
# Code from module double-slash-root:
......@@ -51,9 +52,11 @@ AC_DEFUN([gl_EARLY],
# Code from module extern-inline:
# Code from module fcntl-h:
# Code from module float:
# Code from module gethrxtime:
# Code from module getopt-gnu:
# Code from module getopt-posix:
# Code from module gettext-h:
# Code from module gettime:
# Code from module gettimeofday:
# Code from module include_next:
# Code from module intprops:
......@@ -100,6 +103,7 @@ AC_DEFUN([gl_EARLY],
# Code from module sysexits:
# Code from module tempname:
# Code from module time:
# Code from module timespec:
# Code from module unistd:
# Code from module vasnprintf:
# Code from module verify:
......@@ -129,6 +133,7 @@ AC_DEFUN([gl_INIT],
m4_ifdef([AM_XGETTEXT_OPTION],
[AM_][XGETTEXT_OPTION([--flag=argp_error:2:c-format])
AM_][XGETTEXT_OPTION([--flag=argp_failure:4:c-format])])
gl_CLOCK_TIME
gl_DIRNAME_LGPL
gl_DOUBLE_SLASH_ROOT
gl_HEADER_ERRNO_H
......@@ -149,6 +154,11 @@ AC_DEFUN([gl_INIT],
if test $REPLACE_ITOLD = 1; then
AC_LIBOBJ([itold])
fi
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
gl_FUNC_GETOPT_GNU
if test $REPLACE_GETOPT = 1; then
AC_LIBOBJ([getopt])
......@@ -170,6 +180,7 @@ AC_DEFUN([gl_INIT],
AC_SUBST([GNULIB_GL_UNISTD_H_GETOPT])
AC_SUBST([LIBINTL])
AC_SUBST([LTLIBINTL])
gl_GETTIME
gl_FUNC_GETTIMEOFDAY
if test $HAVE_GETTIMEOFDAY = 0 || test $REPLACE_GETTIMEOFDAY = 1; then
AC_LIBOBJ([gettimeofday])
......@@ -297,6 +308,7 @@ AC_DEFUN([gl_INIT],
gl_SYSEXITS
gl_FUNC_GEN_TEMPNAME
gl_HEADER_TIME_H
gl_TIMESPEC
gl_UNISTD_H
gl_FUNC_VASNPRINTF
gl_FUNC_VSNPRINTF
......@@ -474,11 +486,14 @@ AC_DEFUN([gl_FILE_LIST], [
lib/float+.h
lib/float.c
lib/float.in.h
lib/gethrxtime.c
lib/gethrxtime.h
lib/getopt.c
lib/getopt.in.h
lib/getopt1.c
lib/getopt_int.h
lib/gettext.h
lib/gettime.c
lib/gettimeofday.c
lib/intprops.h
lib/itold.c
......@@ -529,6 +544,8 @@ AC_DEFUN([gl_FILE_LIST], [
lib/tempname.c
lib/tempname.h
lib/time.in.h
lib/timespec.c
lib/timespec.h
lib/unistd.in.h
lib/vasnprintf.c
lib/vasnprintf.h
......@@ -537,9 +554,11 @@ AC_DEFUN([gl_FILE_LIST], [
lib/wchar.in.h
lib/xsize.c
lib/xsize.h
lib/xtime.h
m4/00gnulib.m4
m4/alloca.m4
m4/argp.m4
m4/clock_time.m4
m4/dirname.m4
m4/double-slash-root.m4
m4/errno_h.m4
......@@ -550,7 +569,9 @@ AC_DEFUN([gl_FILE_LIST], [
m4/fcntl-o.m4
m4/fcntl_h.m4
m4/float_h.m4
m4/gethrxtime.m4
m4/getopt.m4
m4/gettime.m4
m4/gettimeofday.m4
m4/gnulib-common.m4
m4/include_next.m4
......@@ -598,6 +619,7 @@ AC_DEFUN([gl_FILE_LIST], [
m4/sysexits.m4
m4/tempname.m4
m4/time_h.m4
m4/timespec.m4
m4/unistd_h.m4
m4/vasnprintf.m4
m4/vsnprintf.m4
......
#serial 15
# Copyright (C) 2000-2001, 2003-2007, 2009-2012 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
dnl From Jim Meyering
AC_DEFUN([gl_TIMESPEC], [:])