git: 9b5d724cad10 - main - libc: Add timespec_getres(3) as per C23.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 24 Aug 2023 21:51:14 UTC
The branch main has been updated by des: URL: https://cgit.FreeBSD.org/src/commit/?id=9b5d724cad10087e34165199e55f15f2df744ed5 commit 9b5d724cad10087e34165199e55f15f2df744ed5 Author: Dag-Erling Smørgrav <des@FreeBSD.org> AuthorDate: 2023-08-24 21:31:11 +0000 Commit: Dag-Erling Smørgrav <des@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 des@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); +}