diff options
author | 2020-07-06 13:33:05 +0000 | |
---|---|---|
committer | 2020-07-06 13:33:05 +0000 | |
commit | d82e6535c6efd8305182f77041b2246ccfae1196 (patch) | |
tree | d28dc130334c17949d90330ecbb2121294b899ff /lib/libc/asr/asr.c | |
parent | sync (diff) | |
download | wireguard-openbsd-d82e6535c6efd8305182f77041b2246ccfae1196.tar.xz wireguard-openbsd-d82e6535c6efd8305182f77041b2246ccfae1196.zip |
Add support for timeconting in userland.
This diff exposes parts of clock_gettime(2) and gettimeofday(2) to
userland via libc eliberating processes from the need for a context
switch everytime they want to count the passage of time.
If a timecounter clock can be exposed to userland than it needs to set
its tc_user member to a non-zero value. Tested with one or multiple
counters per architecture.
The timing data is shared through a pointer found in the new ELF
auxiliary vector AUX_openbsd_timekeep containing timehands information
that is frequently updated by the kernel.
Timing differences between the last kernel update and the current time
are adjusted in userland by the tc_get_timecount() function inside the
MD usertc.c file.
This permits a much more responsive environment, quite visible in
browsers, office programs and gaming (apparently one is are able to fly
in Minecraft now).
Tested by robert@, sthen@, naddy@, kmos@, phessler@, and many others!
OK from at least kettenis@, cheloha@, naddy@, sthen@
Diffstat (limited to 'lib/libc/asr/asr.c')
-rw-r--r-- | lib/libc/asr/asr.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/lib/libc/asr/asr.c b/lib/libc/asr/asr.c index 131da4b2190..8bc25fd82bd 100644 --- a/lib/libc/asr/asr.c +++ b/lib/libc/asr/asr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: asr.c,v 1.63 2020/06/07 16:16:01 deraadt Exp $ */ +/* $OpenBSD: asr.c,v 1.64 2020/07/06 13:33:05 pirofti Exp $ */ /* * Copyright (c) 2010-2012 Eric Faurot <eric@openbsd.org> * @@ -198,11 +198,11 @@ poll_intrsafe(struct pollfd *fds, nfds_t nfds, int timeout) struct timespec pollstart, pollend, elapsed; int r; - if (clock_gettime(CLOCK_MONOTONIC, &pollstart)) + if (WRAP(clock_gettime)(CLOCK_MONOTONIC, &pollstart)) return -1; while ((r = poll(fds, 1, timeout)) == -1 && errno == EINTR) { - if (clock_gettime(CLOCK_MONOTONIC, &pollend)) + if (WRAP(clock_gettime)(CLOCK_MONOTONIC, &pollend)) return -1; timespecsub(&pollend, &pollstart, &elapsed); timeout -= elapsed.tv_sec * 1000 + elapsed.tv_nsec / 1000000; @@ -420,7 +420,7 @@ asr_check_reload(struct asr *asr) asr->a_rtime = 0; } - if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1) + if (WRAP(clock_gettime)(CLOCK_MONOTONIC, &ts) == -1) return; if ((ts.tv_sec - asr->a_rtime) < RELOAD_DELAY && asr->a_rtime != 0) |