The branch main has been updated by des:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=9b5d724cad10087e34165199e55f15f2df744ed5

commit 9b5d724cad10087e34165199e55f15f2df744ed5
Author:     Dag-Erling Smørgrav <d...@freebsd.org>
AuthorDate: 2023-08-24 21:31:11 +0000
Commit:     Dag-Erling Smørgrav <d...@freebsd.org>
CommitDate: 2023-08-24 21:31:54 +0000

    libc: Add timespec_getres(3) as per C23.
    
    This also adds support for TIME_MONOTONIC to timespec_get(3).
    
    Reviewed by:    allanjude
    Differential Revision:  https://reviews.freebsd.org/D41524
---
 include/time.h                 |  8 ++++++-
 lib/libc/gen/Makefile.inc      |  2 ++
 lib/libc/gen/timespec_get.3    | 17 ++++++++++++--
 lib/libc/gen/timespec_get.c    |  4 ++++
 lib/libc/gen/timespec_getres.3 | 51 ++++++++++++++++++++++++++++++++++++++++++
 lib/libc/gen/timespec_getres.c | 24 ++++++++++++++++++++
 6 files changed, 103 insertions(+), 3 deletions(-)

diff --git a/include/time.h b/include/time.h
index c6c083316423..ef55577a2f84 100644
--- a/include/time.h
+++ b/include/time.h
@@ -182,9 +182,15 @@ time_t posix2time(time_t t);
 #if defined(__BSD_VISIBLE) || __ISO_C_VISIBLE >= 2011 || \
     (defined(__cplusplus) && __cplusplus >= 201703)
 #include <sys/_timespec.h>
-/* ISO/IEC 9899:201x 7.27.2.5 The timespec_get function */
+/* ISO/IEC 9899:2011 7.27.2.5 The timespec_get function */
 #define TIME_UTC       1       /* time elapsed since epoch */
 int timespec_get(struct timespec *ts, int base);
+#if defined (__BSD_VISIBLE) || __ISO_C_VISIBLE >= 2023
+/* ISO/IEC 9899:2024 7.29.1 Components of time */
+#define TIME_MONOTONIC 2       /* monotonic time */
+/* ISO/IEC 9899:2024 7.29.2.7 The timespec_getres function */
+int timespec_getres(struct timespec *, int);
+#endif
 #endif
 
 __END_DECLS
diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc
index 34de0e9ddeb0..655843f03715 100644
--- a/lib/libc/gen/Makefile.inc
+++ b/lib/libc/gen/Makefile.inc
@@ -156,6 +156,7 @@ SRCS+=      __getosreldate.c \
        time.c \
        times.c \
        timespec_get.c \
+       timespec_getres.c \
        timezone.c \
        tls.c \
        ttyname.c \
@@ -319,6 +320,7 @@ MAN+=       alarm.3 \
        time.3 \
        times.3 \
        timespec_get.3 \
+       timespec_getres.3 \
        timezone.3 \
        ttyname.3 \
        tzset.3 \
diff --git a/lib/libc/gen/timespec_get.3 b/lib/libc/gen/timespec_get.3
index 00d1a7c684c4..7edf4fe17c30 100644
--- a/lib/libc/gen/timespec_get.3
+++ b/lib/libc/gen/timespec_get.3
@@ -27,7 +27,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd August 10, 2018
+.Dd August 21, 2023
 .Dt TIMESPEC_GET 3
 .Os
 .Sh NAME
@@ -55,6 +55,14 @@ In
 .Fx ,
 this corresponds to
 .Dv CLOCK_REALTIME .
+.Pp
+The base
+.Dv TIME_MONOTONIC
+returns a monotonically-increasing time since an unspecified point in the past.
+In
+.Fx ,
+this corresponds to
+.Dv CLOCK_MONOTONIC .
 .Sh RETURN VALUES
 The
 .Nm
@@ -66,7 +74,8 @@ on failure.
 .Sh SEE ALSO
 .Xr clock_gettime 2 ,
 .Xr gettimeofday 2 ,
-.Xr time 3
+.Xr time 3 ,
+.Xr timespec_getres 3
 .Sh STANDARDS
 The
 .Nm
@@ -76,6 +85,10 @@ of
 .Dv TIME_UTC
 conforms to
 .St -isoC-2011 .
+.\" The
+.\" .Dv TIME_MONOTONIC
+.\" base conforms to
+.\" -isoC-2023 .
 .Sh HISTORY
 This interface first appeared in
 .Fx 12 .
diff --git a/lib/libc/gen/timespec_get.c b/lib/libc/gen/timespec_get.c
index bcf392cbfa44..96845d545048 100644
--- a/lib/libc/gen/timespec_get.c
+++ b/lib/libc/gen/timespec_get.c
@@ -44,6 +44,10 @@ timespec_get(struct timespec *ts, int base)
                if (clock_gettime(CLOCK_REALTIME, ts) == -1)
                        return 0;
                break;
+       case TIME_MONOTONIC:
+               if (clock_gettime(CLOCK_MONOTONIC, ts) == -1)
+                       return 0;
+               break;
        default:
                return 0;
        }
diff --git a/lib/libc/gen/timespec_getres.3 b/lib/libc/gen/timespec_getres.3
new file mode 100644
index 000000000000..e00af6758f1a
--- /dev/null
+++ b/lib/libc/gen/timespec_getres.3
@@ -0,0 +1,51 @@
+.\"-
+.\" Copyright (c) 2023 Dag-Erling Smørgrav
+.\"
+.\" SPDX-License-Identifier: BSD-2-Clause
+.\"
+.Dd August 21, 2023
+.Dt TIMESPEC_GETRES 3
+.Os
+.Sh NAME
+.Nm timespec_getres
+.Nd get clock resolution
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In time.h
+.Ft int
+.Fn timespec_getres "struct timespec *ts" "int base"
+.Sh DESCRIPTION
+If
+.Fa ts
+is non-null and
+.Fa base
+refers to a supported time base as described in
+.Xr timespec_get 3 ,
+the
+.Nm
+function fills in the structure pointed to by
+.Fa ts
+to reflect the resolution of that time base.
+.Sh RETURN VALUES
+The
+.Nm
+function returns the value of
+.Fa base
+if successful and zero otherwise.
+.Sh SEE ALSO
+.Xr clock_getres 2 ,
+.Xr timespec_get 3
+.\" .Sh STANDARDS
+.\" The
+.\" .Nm
+.\" function conforms to
+.\" .St -isoC-2023 .
+.Sh HISTORY
+This interface first appeared in
+.Fx 14 .
+.Sh AUTHORS
+The
+.Nm
+function and this manual page were written by
+.An Dag-Erling Sm\(/orgrav Aq Mt d...@freebsd.org .
diff --git a/lib/libc/gen/timespec_getres.c b/lib/libc/gen/timespec_getres.c
new file mode 100644
index 000000000000..4977d22cf910
--- /dev/null
+++ b/lib/libc/gen/timespec_getres.c
@@ -0,0 +1,24 @@
+/*-
+ * Copyright (c) 2023 Dag-Erling Smørgrav
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <time.h>
+
+int
+timespec_getres(struct timespec *ts, int base)
+{
+
+       switch (base) {
+       case TIME_UTC:
+               if (clock_getres(CLOCK_REALTIME, ts) == 0)
+                       return (base);
+               break;
+       case TIME_MONOTONIC:
+               if (clock_getres(CLOCK_MONOTONIC, ts) == 0)
+                       return (base);
+               break;
+       }
+       return (0);
+}

Reply via email to