summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2005-02-21 08:05:49 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2005-02-21 08:05:49 +0000
commit9df4b1d7e4dd38a5b0efd0614e04f18395663274 (patch)
treeb851f96560385531eaa69dc569059f45a3203ffd /lib
parent80cc962bd565f3f502adff2b33be342be6ef4bbb (diff)
downloadcoreutils-9df4b1d7e4dd38a5b0efd0614e04f18395663274.tar.xz
Initial revision.
Diffstat (limited to 'lib')
-rw-r--r--lib/gethrxtime.c80
-rw-r--r--lib/gethrxtime.h37
-rw-r--r--lib/xtime.h87
3 files changed, 204 insertions, 0 deletions
diff --git a/lib/gethrxtime.c b/lib/gethrxtime.c
new file mode 100644
index 000000000..6f7bc098c
--- /dev/null
+++ b/lib/gethrxtime.c
@@ -0,0 +1,80 @@
+/* gethrxtime -- get high resolution real time
+
+ Copyright (C) 2005 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 2, 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, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* Written by Paul Eggert. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gethrxtime.h"
+
+#include <sys/types.h>
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
+/* Get the time of a high-resolution clock, preferably one 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);
+ }
+
+ /* No monotonically increasing clocks are available; fall back on a
+ clock that might jump backwards, since it's the best we can do. */
+# elif HAVE_GETTIMEOFDAY && XTIME_PRECISION != 1
+ {
+ struct timeval tv;
+ gettimeofday (&tv, NULL);
+ return xtime_make (tv.tv_sec, 1000 * tv.tv_usec);
+ }
+# else
+ return xtime_make (time (NULL), 0);
+# endif
+#endif
+}
diff --git a/lib/gethrxtime.h b/lib/gethrxtime.h
new file mode 100644
index 000000000..2c0e36da7
--- /dev/null
+++ b/lib/gethrxtime.h
@@ -0,0 +1,37 @@
+/* gethrxtime -- get high resolution real time
+
+ Copyright (C) 2005 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 2, 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, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* 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). This clock can't
+ be set, is always increasing, and is nearly linear. */
+
+#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
diff --git a/lib/xtime.h b/lib/xtime.h
new file mode 100644
index 000000000..333f895b6
--- /dev/null
+++ b/lib/xtime.h
@@ -0,0 +1,87 @@
+/* xtime -- extended-resolution integer time stamps
+
+ Copyright (C) 2005 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 2, 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, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* 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
+typedef long long int xtime_t;
+# define XTIME_PRECISION 1000000000LL
+#else
+# include <limits.h>
+typedef long int xtime_t;
+# if LONG_MAX >> 31 >> 31 == 0
+# define XTIME_PRECISION 1L
+# else
+# define XTIME_PRECISION 1000000000L
+# 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, 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 int
+xtime_nonnegative_nsec (xtime_t t)
+{
+ return t % XTIME_PRECISION;
+}
+
+/* Return the number of nanoseconds in T. */
+static inline int
+xtime_nsec (xtime_t t)
+{
+ int ns = t % XTIME_PRECISION;
+ if (ns < 0)
+ ns += XTIME_PRECISION;
+ return ns;
+}
+
+#endif