diff --git a/include/time.h b/include/time.h --- a/include/time.h +++ b/include/time.h @@ -182,9 +182,15 @@ #if defined(__BSD_VISIBLE) || __ISO_C_VISIBLE >= 2011 || \ (defined(__cplusplus) && __cplusplus >= 201703) #include -/* 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 --- a/lib/libc/gen/Makefile.inc +++ b/lib/libc/gen/Makefile.inc @@ -156,6 +156,7 @@ time.c \ times.c \ timespec_get.c \ + timespec_getres.c \ timezone.c \ tls.c \ ttyname.c \ @@ -319,6 +320,7 @@ 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 --- 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 @@ .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 @@ .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 @@ .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 --- a/lib/libc/gen/timespec_get.c +++ b/lib/libc/gen/timespec_get.c @@ -44,6 +44,10 @@ 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 --- /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 des@FreeBSD.org . diff --git a/lib/libc/gen/timespec_getres.c b/lib/libc/gen/timespec_getres.c new file mode 100644 --- /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 + +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); +}