changeset 39847:7245e73971d4

timespec: new function current_timespec * lib/gettime.c (gettime): Prefer clock_gettime to nanotime, and don’t worry about it failing on a CLOCK_REALTIME arg. POSIX requires it to succeed and I don’t know of any counterexamples where the fallbacks would work. (current_timespec): New function, taken from Emacs. It is more convenient than gettime, and can help register allocation. * lib/timespec.h: Include arg-nonnull.h. (current_timespec): New declaration. (gettime, settime): Declare args to be nonnull. * modules/timespec (Depends-on): Add snippet/arg-nonnull.
author Paul Eggert <eggert@cs.ucla.edu>
date Sun, 16 Sep 2018 14:41:36 -0700
parents dbb326309f2a
children b7ec445e40de
files ChangeLog lib/gettime.c lib/timespec.h modules/timespec
diffstat 4 files changed, 38 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sun Sep 16 19:12:44 2018 +0200
+++ b/ChangeLog	Sun Sep 16 14:41:36 2018 -0700
@@ -1,3 +1,17 @@
+2018-09-16  Paul Eggert  <eggert@cs.ucla.edu>
+
+	timespec: new function current_timespec
+	* lib/gettime.c (gettime): Prefer clock_gettime to nanotime,
+	and don’t worry about it failing on a CLOCK_REALTIME arg.
+	POSIX requires it to succeed and I don’t know of any
+	counterexamples where the fallbacks would work.
+	(current_timespec): New function, taken from Emacs.  It is more
+	convenient than gettime, and can help register allocation.
+	* lib/timespec.h: Include arg-nonnull.h.
+	(current_timespec): New declaration.
+	(gettime, settime): Declare args to be nonnull.
+	* modules/timespec (Depends-on): Add snippet/arg-nonnull.
+
 2018-09-16  Bruno Haible  <bruno@clisp.org>
 
 	setlocale: Improve locale handling on macOS 10.12 or newer.
--- a/lib/gettime.c	Sun Sep 16 19:12:44 2018 +0200
+++ b/lib/gettime.c	Sun Sep 16 14:41:36 2018 -0700
@@ -28,21 +28,24 @@
 void
 gettime (struct timespec *ts)
 {
-#if HAVE_NANOTIME
+#if defined CLOCK_REALTIME && HAVE_CLOCK_GETTIME
+  clock_gettime (CLOCK_REALTIME, ts);
+#elif 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;
-  }
-
+  struct timeval tv;
+  gettimeofday (&tv, NULL);
+  ts->tv_sec = tv.tv_sec;
+  ts->tv_nsec = tv.tv_usec * 1000;
 #endif
 }
+
+/* Return the current system time as a struct timespec.  */
+
+struct timespec
+current_timespec (void)
+{
+  struct timespec ts;
+  gettime (&ts);
+  return ts;
+}
--- a/lib/timespec.h	Sun Sep 16 19:12:44 2018 +0200
+++ b/lib/timespec.h	Sun Sep 16 14:41:36 2018 -0700
@@ -17,9 +17,9 @@
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if ! defined TIMESPEC_H
-# define TIMESPEC_H
+#define TIMESPEC_H
 
-# include <time.h>
+#include <time.h>
 
 #ifndef _GL_INLINE_HEADER_BEGIN
  #error "Please include config.h first."
@@ -33,6 +33,7 @@
 extern "C" {
 #endif
 
+#include "arg-nonnull.h"
 #include "verify.h"
 
 /* Inverse resolution of timespec timestamps (in units per second),
@@ -122,8 +123,9 @@
   return a.tv_sec + a.tv_nsec / 1e9;
 }
 
-void gettime (struct timespec *);
-int settime (struct timespec const *);
+struct timespec current_timespec (void);
+void gettime (struct timespec *) _GL_ARG_NONNULL ((1));
+int settime (struct timespec const *) _GL_ARG_NONNULL ((1));
 
 #ifdef __cplusplus
 }
--- a/modules/timespec	Sun Sep 16 19:12:44 2018 +0200
+++ b/modules/timespec	Sun Sep 16 14:41:36 2018 -0700
@@ -8,6 +8,7 @@
 
 Depends-on:
 extern-inline
+snippet/arg-nonnull
 time
 verify