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
This commit is contained in:
Dag-Erling Smørgrav 2023-08-24 21:31:11 +00:00
parent b8b6bef43f
commit 9b5d724cad
6 changed files with 103 additions and 3 deletions

View File

@ -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

View File

@ -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 \

View File

@ -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 .

View File

@ -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;
}

View File

@ -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 .

View File

@ -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);
}