public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 0/2] Implement newly add timebase defines for c2x timespec_get and timespec_getres
@ 2023-06-21 18:32 Yonggang Luo
  2023-06-21 18:32 ` [PATCH 1/2] time: " Yonggang Luo
  2023-06-21 18:32 ` [PATCH 2/2] time: Implement extra timebase defines for " Yonggang Luo
  0 siblings, 2 replies; 3+ messages in thread
From: Yonggang Luo @ 2023-06-21 18:32 UTC (permalink / raw)
  To: Joseph Myers, libc-alpha; +Cc: Yonggang Luo

The c2x and extra defines comes from
https://gustedt.gitlabpages.inria.fr/c23-library/#time_monotonic-time_active-time_thread_active

Yonggang Luo (2):
  time: Implement newly add timebase defines for c2x timespec_get and
    timespec_getres
  time: Implement extra timebase defines for timespec_get and
    timespec_getres

 NEWS                                      | 15 +++++
 include/time.h                            | 60 +++++++++++++++++++
 sysdeps/unix/sysv/linux/timespec_get.c    |  7 ++-
 sysdeps/unix/sysv/linux/timespec_getres.c |  5 +-
 time/time.h                               | 17 +++++-
 time/timespec_get.c                       |  7 ++-
 time/timespec_getres.c                    |  7 ++-
 time/tst-timespec_get.c                   | 58 +++++++++++++++++--
 time/tst-timespec_getres.c                | 70 ++++++++++++++++++-----
 9 files changed, 217 insertions(+), 29 deletions(-)

-- 
2.39.0.windows.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/2] time: Implement newly add timebase defines for c2x timespec_get and timespec_getres
  2023-06-21 18:32 [PATCH 0/2] Implement newly add timebase defines for c2x timespec_get and timespec_getres Yonggang Luo
@ 2023-06-21 18:32 ` Yonggang Luo
  2023-06-21 18:32 ` [PATCH 2/2] time: Implement extra timebase defines for " Yonggang Luo
  1 sibling, 0 replies; 3+ messages in thread
From: Yonggang Luo @ 2023-06-21 18:32 UTC (permalink / raw)
  To: Joseph Myers, libc-alpha; +Cc: Yonggang Luo

The following timebase defines are implemented
# define TIME_MONOTONIC          2
# define TIME_ACTIVE             3
# define TIME_THREAD_ACTIVE      4

And a private function named clock_from_timebase is added, this is used to
map c11 timebase to posix clockid_t in a common place
Maybe it's can be prompted into a POSIX function
in future to resolve issue that from
https://www.openwall.com/lists/libc-coord/2023/04/25/1

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 NEWS                                      |  5 +++
 include/time.h                            | 26 ++++++++++++++++
 sysdeps/unix/sysv/linux/timespec_get.c    |  7 +++--
 sysdeps/unix/sysv/linux/timespec_getres.c |  5 +--
 time/time.h                               |  7 ++++-
 time/timespec_get.c                       |  7 +++--
 time/timespec_getres.c                    |  7 +++--
 time/tst-timespec_get.c                   | 17 ++++++++---
 time/tst-timespec_getres.c                | 37 ++++++++++++++---------
 9 files changed, 88 insertions(+), 30 deletions(-)

diff --git a/NEWS b/NEWS
index 709ee40e50..375e15c5e1 100644
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,11 @@ Version 2.38
 
 Major new features:
 
+* C2x timebase macro defines are supported, these are:
+  TIME_MONOTONIC
+  TIME_ACTIVE
+  TIME_THREAD_ACTIVE
+
 * When C2X features are enabled and the base argument is 0 or 2, the
   following functions support binary integers prefixed by 0b or 0B as
   input: strtol, strtoll, strtoul, strtoull, strtol_l, strtoll_l,
diff --git a/include/time.h b/include/time.h
index f599eeed4e..77ca52ecbf 100644
--- a/include/time.h
+++ b/include/time.h
@@ -361,6 +361,32 @@ in_time_t_range (__time64_t t)
   return s == t;
 }
 
+/* Helper that convert from c11 timebase to posix clockid_t,
+   when the mapping not exist, return -1 */
+static inline clockid_t
+clock_from_timebase (int timebase)
+{
+  clockid_t clockid = -1;
+  switch (timebase)
+    {
+    case TIME_UTC:
+      clockid = CLOCK_REALTIME;
+      break;
+    case TIME_MONOTONIC:
+      clockid = CLOCK_MONOTONIC;
+      break;
+    case TIME_ACTIVE:
+      clockid = CLOCK_PROCESS_CPUTIME_ID;
+      break;
+    case TIME_THREAD_ACTIVE:
+      clockid = CLOCK_THREAD_CPUTIME_ID;
+      break;
+    default:
+      break;
+    }
+  return clockid;
+}
+
 /* Convert a known valid struct timeval into a struct __timespec64.  */
 static inline struct __timespec64
 valid_timeval_to_timespec64 (const struct timeval tv)
diff --git a/sysdeps/unix/sysv/linux/timespec_get.c b/sysdeps/unix/sysv/linux/timespec_get.c
index 3c852be99b..40d3ae3f0d 100644
--- a/sysdeps/unix/sysv/linux/timespec_get.c
+++ b/sysdeps/unix/sysv/linux/timespec_get.c
@@ -23,10 +23,11 @@
 int
 __timespec_get64 (struct __timespec64 *ts, int base)
 {
-  if (base == TIME_UTC)
+  clockid_t clockid = clock_from_timebase (base);
+  if (clockid >= 0)
     {
-      __clock_gettime64 (CLOCK_REALTIME, ts);
-      return base;
+      if (__clock_gettime (clockid, ts) >= 0)
+        return base;
     }
   return 0;
 }
diff --git a/sysdeps/unix/sysv/linux/timespec_getres.c b/sysdeps/unix/sysv/linux/timespec_getres.c
index 7e61d78a77..e73c73cf74 100644
--- a/sysdeps/unix/sysv/linux/timespec_getres.c
+++ b/sysdeps/unix/sysv/linux/timespec_getres.c
@@ -22,9 +22,10 @@
 int
 __timespec_getres64 (struct __timespec64 *ts, int base)
 {
-  if (base == TIME_UTC)
+  clockid_t clockid = clock_from_timebase (base);
+  if (clockid >= 0)
     {
-      __clock_getres64 (CLOCK_REALTIME, ts);
+      __clock_getres64 (clockid, ts);
       return base;
     }
   return 0;
diff --git a/time/time.h b/time/time.h
index 368f4dc588..d01c90e229 100644
--- a/time/time.h
+++ b/time/time.h
@@ -62,7 +62,12 @@ typedef __pid_t pid_t;
 
 #ifdef __USE_ISOC11
 /* Time base values for timespec_get.  */
-# define TIME_UTC 1
+# define TIME_UTC                1
+#endif
+#if __GLIBC_USE_ISOC2X
+# define TIME_MONOTONIC          2
+# define TIME_ACTIVE             3
+# define TIME_THREAD_ACTIVE      4
 #endif
 
 __BEGIN_DECLS
diff --git a/time/timespec_get.c b/time/timespec_get.c
index 9b1d4f22ed..93aa442ca0 100644
--- a/time/timespec_get.c
+++ b/time/timespec_get.c
@@ -22,10 +22,11 @@
 int
 timespec_get (struct timespec *ts, int base)
 {
-  if (base == TIME_UTC)
+  clockid_t clockid = clock_from_timebase (base);
+  if (clockid >= 0)
     {
-      __clock_gettime (CLOCK_REALTIME, ts);
-      return base;
+      if (__clock_gettime (clockid, ts) >= 0)
+        return base;
     }
   return 0;
 }
diff --git a/time/timespec_getres.c b/time/timespec_getres.c
index fd64dc7a47..3cc7a4b3bb 100644
--- a/time/timespec_getres.c
+++ b/time/timespec_getres.c
@@ -23,10 +23,11 @@
 int
 timespec_getres (struct timespec *ts, int base)
 {
-  if (base == TIME_UTC)
+  clockid_t clockid = clock_from_timebase (base);
+  if (clockid >= 0)
     {
-      __clock_getres (CLOCK_REALTIME, ts);
-      return base;
+      if (__clock_getres (clockid, ts) >= 0)
+        return base;
     }
   return 0;
 }
diff --git a/time/tst-timespec_get.c b/time/tst-timespec_get.c
index d735160394..f97327666c 100644
--- a/time/tst-timespec_get.c
+++ b/time/tst-timespec_get.c
@@ -19,6 +19,15 @@
 #include <time.h>
 #include <support/check.h>
 
+static void
+test_timespec_get (int timebase)
+{
+    struct timespec ts;
+    TEST_COMPARE (timespec_get (&ts, timebase), timebase);
+    TEST_VERIFY (ts.tv_nsec >= 0);
+    TEST_VERIFY (ts.tv_nsec < 1000000000);
+}
+
 static int
 do_test (void)
 {
@@ -28,10 +37,10 @@ do_test (void)
   }
 
   {
-    struct timespec ts;
-    TEST_COMPARE (timespec_get (&ts, TIME_UTC), TIME_UTC);
-    TEST_VERIFY (ts.tv_nsec >= 0);
-    TEST_VERIFY (ts.tv_nsec < 1000000000);
+    test_timespec_get (TIME_UTC);
+    test_timespec_get (TIME_MONOTONIC);
+    test_timespec_get (TIME_ACTIVE);
+    test_timespec_get (TIME_THREAD_ACTIVE);
   }
 
   return 0;
diff --git a/time/tst-timespec_getres.c b/time/tst-timespec_getres.c
index b400a70138..960f7c3298 100644
--- a/time/tst-timespec_getres.c
+++ b/time/tst-timespec_getres.c
@@ -19,6 +19,25 @@
 #include <time.h>
 #include <support/check.h>
 
+static void
+test_timespec_getres (clockid_t clock, int timebase)
+{
+  struct timespec ts;
+  TEST_COMPARE (timespec_getres (&ts, timebase), timebase);
+  /* Expect all supported systems to support timebase with
+     resolution better than one second.  */
+  TEST_VERIFY (ts.tv_sec == 0);
+  TEST_VERIFY (ts.tv_nsec > 0);
+  TEST_VERIFY (ts.tv_nsec < 1000000000);
+  TEST_COMPARE (timespec_getres (NULL, timebase), timebase);
+  /* Expect the resolution to be the same as that reported for
+     clock with clock_getres.  */
+  struct timespec cts;
+  TEST_COMPARE (clock_getres (clock, &cts), 0);
+  TEST_COMPARE (ts.tv_sec, cts.tv_sec);
+  TEST_COMPARE (ts.tv_nsec, cts.tv_nsec);
+}
+
 static int
 do_test (void)
 {
@@ -29,20 +48,10 @@ do_test (void)
   }
 
   {
-    struct timespec ts;
-    TEST_COMPARE (timespec_getres (&ts, TIME_UTC), TIME_UTC);
-    /* Expect all supported systems to support TIME_UTC with
-       resolution better than one second.  */
-    TEST_VERIFY (ts.tv_sec == 0);
-    TEST_VERIFY (ts.tv_nsec > 0);
-    TEST_VERIFY (ts.tv_nsec < 1000000000);
-    TEST_COMPARE (timespec_getres (NULL, TIME_UTC), TIME_UTC);
-    /* Expect the resolution to be the same as that reported for
-       CLOCK_REALTIME with clock_getres.  */
-    struct timespec cts;
-    TEST_COMPARE (clock_getres (CLOCK_REALTIME, &cts), 0);
-    TEST_COMPARE (ts.tv_sec, cts.tv_sec);
-    TEST_COMPARE (ts.tv_nsec, cts.tv_nsec);
+    test_timespec_getres (CLOCK_REALTIME, TIME_UTC);
+    test_timespec_getres (CLOCK_MONOTONIC, TIME_MONOTONIC);
+    test_timespec_getres (CLOCK_PROCESS_CPUTIME_ID, TIME_ACTIVE);
+    test_timespec_getres (CLOCK_THREAD_CPUTIME_ID, TIME_THREAD_ACTIVE);
   }
 
   return 0;
-- 
2.39.0.windows.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 2/2] time: Implement extra timebase defines for timespec_get and timespec_getres
  2023-06-21 18:32 [PATCH 0/2] Implement newly add timebase defines for c2x timespec_get and timespec_getres Yonggang Luo
  2023-06-21 18:32 ` [PATCH 1/2] time: " Yonggang Luo
@ 2023-06-21 18:32 ` Yonggang Luo
  1 sibling, 0 replies; 3+ messages in thread
From: Yonggang Luo @ 2023-06-21 18:32 UTC (permalink / raw)
  To: Joseph Myers, libc-alpha; +Cc: Yonggang Luo

these are:

  TIME_MONOTONIC_RAW
  TIME_UTC_COARSE
  TIME_MONOTONIC_COARSE
  TIME_BOOTTIME
  TIME_UTC_ALARM
  TIME_BOOTTIME_ALARM
  TIME_SGI_CYCLE
  TIME_TAI

according to https://gustedt.gitlabpages.inria.fr/c23-library/#time_monotonic-time_active-time_thread_active

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 NEWS                       | 10 ++++++++++
 include/time.h             | 34 +++++++++++++++++++++++++++++++
 time/time.h                | 10 ++++++++++
 time/tst-timespec_get.c    | 41 ++++++++++++++++++++++++++++++++++++++
 time/tst-timespec_getres.c | 35 ++++++++++++++++++++++++++++++++
 5 files changed, 130 insertions(+)

diff --git a/NEWS b/NEWS
index 375e15c5e1..2889e4b6c4 100644
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,16 @@ Version 2.38
 
 Major new features:
 
+* Extra timebase defines are supported, these are:
+  TIME_MONOTONIC_RAW
+  TIME_UTC_COARSE
+  TIME_MONOTONIC_COARSE
+  TIME_BOOTTIME
+  TIME_UTC_ALARM
+  TIME_BOOTTIME_ALARM
+  TIME_SGI_CYCLE
+  TIME_TAI
+
 * C2x timebase macro defines are supported, these are:
   TIME_MONOTONIC
   TIME_ACTIVE
diff --git a/include/time.h b/include/time.h
index 77ca52ecbf..19db10ffc6 100644
--- a/include/time.h
+++ b/include/time.h
@@ -381,6 +381,40 @@ clock_from_timebase (int timebase)
     case TIME_THREAD_ACTIVE:
       clockid = CLOCK_THREAD_CPUTIME_ID;
       break;
+    case TIME_MONOTONIC_RAW:
+      clockid = CLOCK_MONOTONIC_RAW;
+      break;
+    case TIME_UTC_COARSE:
+      clockid = CLOCK_REALTIME_COARSE;
+      break;
+    case TIME_MONOTONIC_COARSE:
+      clockid = CLOCK_MONOTONIC_COARSE;
+      break;
+#    ifdef CLOCK_BOOTTIME
+    case TIME_BOOTTIME:
+      clockid = CLOCK_BOOTTIME;
+      break;
+#    endif
+#    ifdef CLOCK_REALTIME_ALARM
+    case TIME_UTC_ALARM:
+      clockid = CLOCK_REALTIME_ALARM;
+      break;
+#    endif
+#    ifdef CLOCK_BOOTTIME_ALARM
+    case TIME_BOOTTIME_ALARM:
+      clockid = CLOCK_BOOTTIME_ALARM;
+      break;
+#    endif
+#    ifdef CLOCK_SGI_CYCLE
+    case TIME_SGI_CYCLE:
+      clockid = CLOCK_SGI_CYCLE;
+      break;
+#    endif
+#    ifdef CLOCK_TAI
+    case TIME_TAI:
+      clockid = CLOCK_TAI;
+      break;
+#    endif
     default:
       break;
     }
diff --git a/time/time.h b/time/time.h
index d01c90e229..10dfabbd3f 100644
--- a/time/time.h
+++ b/time/time.h
@@ -69,6 +69,16 @@ typedef __pid_t pid_t;
 # define TIME_ACTIVE             3
 # define TIME_THREAD_ACTIVE      4
 #endif
+#ifdef __USE_GNU
+# define TIME_MONOTONIC_RAW      5
+# define TIME_UTC_COARSE         6
+# define TIME_MONOTONIC_COARSE   7
+# define TIME_BOOTTIME           8
+# define TIME_UTC_ALARM          9
+# define TIME_BOOTTIME_ALARM     10
+# define TIME_SGI_CYCLE          11
+# define TIME_TAI                12
+#endif
 
 __BEGIN_DECLS
 
diff --git a/time/tst-timespec_get.c b/time/tst-timespec_get.c
index f97327666c..99a08279fc 100644
--- a/time/tst-timespec_get.c
+++ b/time/tst-timespec_get.c
@@ -28,6 +28,13 @@ test_timespec_get (int timebase)
     TEST_VERIFY (ts.tv_nsec < 1000000000);
 }
 
+static void
+test_timespec_get_not_support(int timebase)
+{
+    struct timespec ts;
+    TEST_COMPARE (timespec_get (&ts, timebase), 0);
+}
+
 static int
 do_test (void)
 {
@@ -43,6 +50,40 @@ do_test (void)
     test_timespec_get (TIME_THREAD_ACTIVE);
   }
 
+  {
+    test_timespec_get (TIME_MONOTONIC_RAW);
+    test_timespec_get (TIME_UTC_COARSE);
+    test_timespec_get (TIME_MONOTONIC_COARSE);
+  }
+
+  {
+#ifdef CLOCK_BOOTTIME
+    test_timespec_get (TIME_BOOTTIME);
+#else
+    test_timespec_get_not_support (TIME_BOOTTIME);
+#endif
+#ifdef CLOCK_REALTIME_ALARM
+    test_timespec_get (TIME_UTC_ALARM);
+#else
+    test_timespec_get_not_support (TIME_UTC_ALARM);
+#endif
+#ifdef CLOCK_BOOTTIME_ALARM
+    test_timespec_get (TIME_BOOTTIME_ALARM);
+#else
+    test_timespec_get_not_support (TIME_BOOTTIME_ALARM);
+#endif
+#ifdef CLOCK_SGI_CYCLE
+    test_timespec_get (TIME_SGI_CYCLE);
+#else
+    test_timespec_get_not_support (TIME_SGI_CYCLE);
+#endif
+#ifdef CLOCK_TAI
+    test_timespec_get (TIME_TAI);
+#else
+    test_timespec_get_not_support (TIME_TAI);
+#endif
+  }
+
   return 0;
 }
 
diff --git a/time/tst-timespec_getres.c b/time/tst-timespec_getres.c
index 960f7c3298..623a1d841c 100644
--- a/time/tst-timespec_getres.c
+++ b/time/tst-timespec_getres.c
@@ -54,6 +54,41 @@ do_test (void)
     test_timespec_getres (CLOCK_THREAD_CPUTIME_ID, TIME_THREAD_ACTIVE);
   }
 
+  {
+    test_timespec_getres (CLOCK_MONOTONIC_RAW, TIME_MONOTONIC_RAW);
+    test_timespec_getres (CLOCK_REALTIME_COARSE, TIME_UTC_COARSE);
+    test_timespec_getres (CLOCK_MONOTONIC_COARSE, TIME_MONOTONIC_COARSE);
+  }
+
+  {
+    struct timespec ts;
+#ifdef CLOCK_BOOTTIME
+    test_timespec_getres (CLOCK_BOOTTIME, TIME_BOOTTIME);
+#else
+    TEST_COMPARE (timespec_getres (&ts, TIME_BOOTTIME), 0);
+#endif
+#ifdef CLOCK_REALTIME_ALARM
+    test_timespec_getres (CLOCK_REALTIME_ALARM, TIME_UTC_ALARM);
+#else
+    TEST_COMPARE (timespec_getres (&ts, TIME_UTC_ALARM), 0);
+#endif
+#ifdef CLOCK_BOOTTIME_ALARM
+    test_timespec_getres (CLOCK_BOOTTIME_ALARM, TIME_BOOTTIME_ALARM);
+#else
+    TEST_COMPARE (timespec_getres (&ts, TIME_BOOTTIME_ALARM), 0);
+#endif
+#ifdef CLOCK_SGI_CYCLE
+    test_timespec_getres (CLOCK_SGI_CYCLE, TIME_SGI_CYCLE);
+#else
+    TEST_COMPARE (timespec_getres (&ts, TIME_SGI_CYCLE), 0);
+#endif
+#ifdef CLOCK_TAI
+    test_timespec_getres (CLOCK_TAI, TIME_TAI);
+#else
+    TEST_COMPARE (timespec_getres (&ts, TIME_TAI), 0);
+#endif
+  }
+
   return 0;
 }
 
-- 
2.39.0.windows.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-06-21 18:32 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-21 18:32 [PATCH 0/2] Implement newly add timebase defines for c2x timespec_get and timespec_getres Yonggang Luo
2023-06-21 18:32 ` [PATCH 1/2] time: " Yonggang Luo
2023-06-21 18:32 ` [PATCH 2/2] time: Implement extra timebase defines for " Yonggang Luo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).