* [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).