On 25/06/2026 9:17 pm, Jan Stary wrote:
Hi,
According to tests/lib/libc/sys/t_clock_gettime.c
""These clocks aren't supported but are documented"
" in clock_gettime(2) for some reason"
thanks for the pointer. I am new to NetBSD
and am only getting into tests(7) so please bare with me.
According to these test results (random google hit, but a recent run)
https://www.netbsd.org/~martin/landisk-atf/last_atf.html#lib_libc_sys_t_clock_gettime_clock_getres
calling clock_getres() on these two clocks is expected to fail.
It seems a bit silly to test that NetBSD does _not_ support a clock.
(Isn't clock_gettime() also expected to fail, if they do not exist? :-)
Wouldn't it make more sense to just remove these from the documentation?
There's also a PR in about CLOCK_MONOTONIC & what it actually represents:
https://gnats.netbsd.org/60315
My point with raising the PR also is that clock_getres() et al are
poorly documented (and as you have discovered),
just plain wrong.
Thank you. I am in fact studying the clock_*() interface on various
unixes and what clocks they provide - see my naive take below.
I guess my first question (please excuse the naivety) is where is
NetBSD's clock_get*() implemented? That must be these, right?
/usr/src/sys/kern/kern_time.c:clock_getres1()
/usr/src/sys/kern/subr_time.c:clock_gettime1()
These only support
CLOCK_REALTIME
CLOCK_MONOTONIC
CLOCK_PROCESS_CPUTIME_ID
CLOCK_THREAD_CPUTIME_ID
and set EINVAL otherwise.
Jan
Yes.
My tested view of all OS you have macros for test as expected and
documented by their relevant manual pages.
Only NetBSD is wrong and vague. Actually I'm not sure about OpenBSD, I
am not expected to cater for that toy OS.
Solaris also has some of these timers, but not all. Newer versions of
OpenVMS support some as well. I think Solaris has had this for a long
time, but OpenVMS only under its x86 development due to virtualisation
support.
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <err.h>
void
show(clockid_t id, char* name)
{
struct timespec ts;
struct timespec cr;
if (clock_gettime(id, &ts) == -1)
err(1, NULL);
if (clock_getres(id, &cr) == -1)
err(1, NULL);
printf("%s %10lld.%09ld s, %8ld ns resolution\n",
name, ts.tv_sec, ts.tv_nsec, cr.tv_nsec);
}
int
main(void)
{
#ifdef __APPLE__
show(CLOCK_REALTIME, "real time");
show(CLOCK_MONOTONIC, "monotonic");
show(CLOCK_UPTIME_RAW, "up time ");
show(CLOCK_PROCESS_CPUTIME_ID, "proc time");
#elif __OpenBSD__
show(CLOCK_REALTIME, "real time");
show(CLOCK_MONOTONIC, "monotonic");
show(CLOCK_BOOTTIME, "boot time");
show(CLOCK_UPTIME, "up time ");
show(CLOCK_PROCESS_CPUTIME_ID, "proc time");
#elif __FreeBSD__
show(CLOCK_REALTIME, "real time");
show(CLOCK_MONOTONIC, "monotonic");
show(CLOCK_BOOTTIME, "boot time");
show(CLOCK_UPTIME, "up time ");
show(CLOCK_PROCESS_CPUTIME_ID, "proc time");
#elif __NetBSD__
show(CLOCK_REALTIME, "real time");
show(CLOCK_MONOTONIC, "monotonic");
show(CLOCK_PROCESS_CPUTIME_ID, "proc time");
#else
show(CLOCK_REALTIME, "real time");
show(CLOCK_MONOTONIC, "monotonic");
show(CLOCK_BOOTTIME, "boot time");
show(CLOCK_PROCESS_CPUTIME_ID, "proc time");
#endif
return 0;
}
Maybe test for CLOCK_???? like : if #defined (CLOCK_UPTIME) makes more
sense?