bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 4/5] timespec_getres: new module


From: Paul Eggert
Subject: [PATCH 4/5] timespec_getres: new module
Date: Tue, 28 Dec 2021 12:05:13 -0800

* lib/time.in.h (timespec_getres): New decl.
* lib/timespec_getres.c, m4/timespec_getres.m4:
* modules/timespec_getres, modules/timespec_getres-tests:
* tests/test-timespec_getres.c:
New files.
* m4/time_h.m4 (gl_TIME_H_REQUIRE_DEFAULTS, gl_TIME_H_DEFAULTS):
* modules/time (time.h):
Support timespec_getres.
---
 ChangeLog                                | 10 ++++++
 doc/glibc-functions/timespec_getres.texi | 16 ++++++++++
 doc/posix-functions/timespec_getres.texi |  8 ++---
 lib/time.in.h                            | 11 +++++++
 lib/timespec_getres.c                    | 40 ++++++++++++++++++++++++
 m4/time_h.m4                             |  4 ++-
 m4/timespec_getres.m4                    | 18 +++++++++++
 modules/time                             |  2 ++
 modules/timespec_getres                  | 32 +++++++++++++++++++
 modules/timespec_getres-tests            | 13 ++++++++
 tests/test-timespec_getres.c             | 40 ++++++++++++++++++++++++
 11 files changed, 189 insertions(+), 5 deletions(-)
 create mode 100644 doc/glibc-functions/timespec_getres.texi
 create mode 100644 lib/timespec_getres.c
 create mode 100644 m4/timespec_getres.m4
 create mode 100644 modules/timespec_getres
 create mode 100644 modules/timespec_getres-tests
 create mode 100644 tests/test-timespec_getres.c

diff --git a/ChangeLog b/ChangeLog
index 8b25c542b..79739541e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2021-12-28  Paul Eggert  <eggert@cs.ucla.edu>
 
+       timespec_getres: new module
+       * lib/time.in.h (timespec_getres): New decl.
+       * lib/timespec_getres.c, m4/timespec_getres.m4:
+       * modules/timespec_getres, modules/timespec_getres-tests:
+       * tests/test-timespec_getres.c:
+       New files.
+       * m4/time_h.m4 (gl_TIME_H_REQUIRE_DEFAULTS, gl_TIME_H_DEFAULTS):
+       * modules/time (time.h):
+       Support timespec_getres.
+
        gettime-res: new module
        * lib/gettime-res.c, modules/gettime-res: New files.
        * lib/timespec.h (gettime_res): New decl.
diff --git a/doc/glibc-functions/timespec_getres.texi 
b/doc/glibc-functions/timespec_getres.texi
new file mode 100644
index 000000000..45128ee19
--- /dev/null
+++ b/doc/glibc-functions/timespec_getres.texi
@@ -0,0 +1,16 @@
+@node timespec_getres
+@subsection @code{timespec_getres}
+@findex timespec_getres
+
+Gnulib module: timespec_get
+
+Portability problems fixed by Gnulib:
+@itemize
+@item
+This function is missing on many platforms:
+glibc 2.33, macOS 12, FreeBSD 13.0, NetBSD 9.2, OpenBSD 7.0, Minix 3.3.0, AIX 
7.1, HP-UX 11.31, IRIX 6.5, Solaris 11.3, Cygwin 2.9, mingw, MSVC 14, Android 
9.0.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
diff --git a/doc/posix-functions/timespec_getres.texi 
b/doc/posix-functions/timespec_getres.texi
index 4c6549b91..89d3e6f16 100644
--- a/doc/posix-functions/timespec_getres.texi
+++ b/doc/posix-functions/timespec_getres.texi
@@ -4,15 +4,15 @@
 
 ISO C2x specification:@* 
@url{http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf} section 7.27.2.6
 
-Gnulib module: ---
+Gnulib module: timespec_getres
 
 Portability problems fixed by Gnulib:
 @itemize
+@item
+This function is missing on some platforms:
+glibc 2.33, macOS 12, FreeBSD 13.0, NetBSD 9.2, OpenBSD 7.0, Minix 3.3.0, AIX 
7.1, HP-UX 11.31, IRIX 6.5, Solaris 11.3, Cygwin 2.9, mingw, MSVC 14, Android 
9.0.
 @end itemize
 
 Portability problems not fixed by Gnulib:
 @itemize
-@item
-This function is missing on some platforms:
-glibc 2.33, macOS 11.1, FreeBSD 13.0, NetBSD 9.0, OpenBSD 6.7, Minix 3.3.0, 
AIX 7.1, HP-UX 11.31, IRIX 6.5, Solaris 11.4, Cygwin 2.9, mingw, MSVC 14, 
Android 9.0.
 @end itemize
diff --git a/lib/time.in.h b/lib/time.in.h
index a73fe59cb..383e9768b 100644
--- a/lib/time.in.h
+++ b/lib/time.in.h
@@ -120,6 +120,17 @@ _GL_CXXALIAS_SYS (timespec_get, int, (struct timespec *ts, 
int base));
 _GL_CXXALIASWARN (timespec_get);
 # endif
 
+/* Set *TS to the current time resolution, and return BASE.
+   Upon failure, return 0.  */
+# if @GNULIB_TIMESPEC_GETRES@
+#  if ! @HAVE_TIMESPEC_GETRES@
+_GL_FUNCDECL_SYS (timespec_getres, int, (struct timespec *ts, int base)
+                                        _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (timespec_getres, int, (struct timespec *ts, int base));
+_GL_CXXALIASWARN (timespec_getres);
+# endif
+
 /* Sleep for at least RQTP seconds unless interrupted,  If interrupted,
    return -1 and store the remaining time into RMTP.  See
    
<https://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html>.  */
diff --git a/lib/timespec_getres.c b/lib/timespec_getres.c
new file mode 100644
index 000000000..6fad0ce2d
--- /dev/null
+++ b/lib/timespec_getres.c
@@ -0,0 +1,40 @@
+/* Get resolution of a time base.
+   Copyright 2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
+
+   This file 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 Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include <time.h>
+
+#include "timespec.h"
+
+/* Set TS to resolution of time base BASE.
+   Return BASE if successful, 0 otherwise.  */
+int
+timespec_getres (struct timespec *ts, int base)
+{
+  if (base == TIME_UTC)
+    {
+#if defined CLOCK_REALTIME && HAVE_CLOCK_GETRES
+      clock_getres (CLOCK_REALTIME, ts);
+#else
+      long int res = gettime_res ();
+      ts->tv_sec = res / TIMESPEC_HZ;
+      ts->tv_nsec = res % TIMESPEC_HZ;
+#endif
+      return base;
+    }
+  return 0;
+}
diff --git a/m4/time_h.m4 b/m4/time_h.m4
index b57474b48..9ba9462ca 100644
--- a/m4/time_h.m4
+++ b/m4/time_h.m4
@@ -2,7 +2,7 @@
 
 # Copyright (C) 2000-2001, 2003-2007, 2009-2021 Free Software Foundation, Inc.
 
-# serial 18
+# serial 19
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -133,6 +133,7 @@ AC_DEFUN([gl_TIME_H_REQUIRE_DEFAULTS],
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRPTIME])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIMEGM])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIMESPEC_GET])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIMESPEC_GETRES])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIME_R])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIME_RZ])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TZSET])
@@ -151,6 +152,7 @@ AC_DEFUN([gl_TIME_H_DEFAULTS],
   HAVE_STRPTIME=1;                       AC_SUBST([HAVE_STRPTIME])
   HAVE_TIMEGM=1;                         AC_SUBST([HAVE_TIMEGM])
   HAVE_TIMESPEC_GET=1;                   AC_SUBST([HAVE_TIMESPEC_GET])
+  HAVE_TIMESPEC_GETRES=1;                AC_SUBST([HAVE_TIMESPEC_GETRES])
   dnl Even GNU libc does not have timezone_t yet.
   HAVE_TIMEZONE_T=0;                     AC_SUBST([HAVE_TIMEZONE_T])
   dnl If another module says to replace or to not replace, do that.
diff --git a/m4/timespec_getres.m4 b/m4/timespec_getres.m4
new file mode 100644
index 000000000..8f42a45f5
--- /dev/null
+++ b/m4/timespec_getres.m4
@@ -0,0 +1,18 @@
+# Test whether timespec_getres works.
+dnl Copyright 2021 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_FUNC_TIMESPEC_GETRES],
+[
+  AC_REQUIRE([gl_TIME_H_DEFAULTS])
+
+  dnl Might be needed for the same reason timespec_get needs it.
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+  AC_CHECK_FUNCS_ONCE([timespec_getres])
+  if test $ac_cv_func_timespec_getres != yes; then
+    HAVE_TIMESPEC_GETRES=0
+  fi
+])
diff --git a/modules/time b/modules/time
index fe38a5048..ae8471bb9 100644
--- a/modules/time
+++ b/modules/time
@@ -40,6 +40,7 @@ time.h: time.in.h $(top_builddir)/config.status $(CXXDEFS_H) 
$(ARG_NONNULL_H) $(
              -e 's/@''GNULIB_STRPTIME''@/$(GNULIB_STRPTIME)/g' \
              -e 's/@''GNULIB_TIMEGM''@/$(GNULIB_TIMEGM)/g' \
              -e 's/@''GNULIB_TIMESPEC_GET''@/$(GNULIB_TIMESPEC_GET)/g' \
+             -e 's/@''GNULIB_TIMESPEC_GETRES''@/$(GNULIB_TIMESPEC_GETRES)/g' \
              -e 's/@''GNULIB_TIME_R''@/$(GNULIB_TIME_R)/g' \
              -e 's/@''GNULIB_TIME_RZ''@/$(GNULIB_TIME_RZ)/g' \
              -e 's/@''GNULIB_TZSET''@/$(GNULIB_TZSET)/g' \
@@ -49,6 +50,7 @@ time.h: time.in.h $(top_builddir)/config.status $(CXXDEFS_H) 
$(ARG_NONNULL_H) $(
              -e 's|@''HAVE_STRPTIME''@|$(HAVE_STRPTIME)|g' \
              -e 's|@''HAVE_TIMEGM''@|$(HAVE_TIMEGM)|g' \
              -e 's|@''HAVE_TIMESPEC_GET''@|$(HAVE_TIMESPEC_GET)|g' \
+             -e 's|@''HAVE_TIMESPEC_GETRES''@|$(HAVE_TIMESPEC_GETRES)|g' \
              -e 's|@''HAVE_TIMEZONE_T''@|$(HAVE_TIMEZONE_T)|g' \
              -e 's|@''REPLACE_CTIME''@|$(REPLACE_CTIME)|g' \
              -e 's|@''REPLACE_GMTIME''@|$(REPLACE_GMTIME)|g' \
diff --git a/modules/timespec_getres b/modules/timespec_getres
new file mode 100644
index 000000000..f9672868e
--- /dev/null
+++ b/modules/timespec_getres
@@ -0,0 +1,32 @@
+Description:
+timespec_getres: return the timestamp resolution
+
+Files:
+lib/timespec_getres.c
+m4/timespec_getres.m4
+
+Depends-on:
+extensions
+time
+gettime-res     [test $HAVE_TIMESPEC_GETRES = 0]
+
+configure.ac:
+AC_REQUIRE([gl_FUNC_TIMESPEC_GETRES])
+if test $HAVE_TIMESPEC_GETRES = 0; then
+  AC_LIBOBJ([timespec_getres])
+fi
+gl_TIME_MODULE_INDICATOR([timespec_getres])
+
+Makefile.am:
+
+Include:
+<time.h>
+
+Link:
+$(LIB_CLOCK_GETTIME)
+
+License:
+LGPL
+
+Maintainer:
+all
diff --git a/modules/timespec_getres-tests b/modules/timespec_getres-tests
new file mode 100644
index 000000000..9bb83cc79
--- /dev/null
+++ b/modules/timespec_getres-tests
@@ -0,0 +1,13 @@
+Files:
+tests/test-timespec_getres.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-timespec_getres
+check_PROGRAMS += test-timespec_getres
+test_timespec_getres_LDADD = $(LDADD) @LIB_CLOCK_GETTIME@
diff --git a/tests/test-timespec_getres.c b/tests/test-timespec_getres.c
new file mode 100644
index 000000000..849036936
--- /dev/null
+++ b/tests/test-timespec_getres.c
@@ -0,0 +1,40 @@
+/* Test timespec_getres.
+   Copyright 2021 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 <https://www.gnu.org/licenses/>.  */
+
+/* Written by Paul Eggert.  */
+
+#include <config.h>
+
+#include <time.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (timespec_getres, int, (struct timespec *ts, int base));
+
+#include "macros.h"
+
+int
+main (void)
+{
+  struct timespec ts;
+  ASSERT (timespec_getres (&ts, TIME_UTC) == TIME_UTC);
+
+  /* No clock resolution should be worse than 1 s or better than 1 ns.  */
+  ASSERT (ts.tv_sec == 0
+          ? 0 < ts.tv_nsec && ts.tv_nsec < 1000000000
+          : ts.tv_sec == 1 && ts.tv_nsec == 0);
+
+  return 0;
+}
-- 
2.33.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]