diff options
author | Paul Irofti <pirofti@cvs.openbsd.org> | 2020-07-06 13:33:10 +0000 |
---|---|---|
committer | Paul Irofti <pirofti@cvs.openbsd.org> | 2020-07-06 13:33:10 +0000 |
commit | b7e506b86a1d9691ff26019343ff523bfd30b393 (patch) | |
tree | 8a57536b8a2a17951281291a4bd58752705f500f /regress/lib/libc | |
parent | cce3edda7285834fa934f9d3e3316d3da5a4f28a (diff) |
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 'regress/lib/libc')
-rw-r--r-- | regress/lib/libc/timekeep/Makefile | 5 | ||||
-rw-r--r-- | regress/lib/libc/timekeep/test_clock_gettime.c | 43 | ||||
-rw-r--r-- | regress/lib/libc/timekeep/test_gettimeofday.c | 37 | ||||
-rw-r--r-- | regress/lib/libc/timekeep/test_time_skew.c | 55 |
4 files changed, 140 insertions, 0 deletions
diff --git a/regress/lib/libc/timekeep/Makefile b/regress/lib/libc/timekeep/Makefile new file mode 100644 index 00000000000..ed7dc60379d --- /dev/null +++ b/regress/lib/libc/timekeep/Makefile @@ -0,0 +1,5 @@ +# $OpenBSD: Makefile,v 1.1 2020/07/06 13:33:06 pirofti Exp $ + +PROGS= test_clock_gettime test_time_skew test_gettimeofday + +.include <bsd.regress.mk> diff --git a/regress/lib/libc/timekeep/test_clock_gettime.c b/regress/lib/libc/timekeep/test_clock_gettime.c new file mode 100644 index 00000000000..cc1d8e36e39 --- /dev/null +++ b/regress/lib/libc/timekeep/test_clock_gettime.c @@ -0,0 +1,43 @@ +/* $OpenBSD: test_clock_gettime.c,v 1.1 2020/07/06 13:33:06 pirofti Exp $ */ +/* + * Copyright (c) 2020 Paul Irofti <paul@irofti.net> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <assert.h> +#include <time.h> + +#define ASSERT_EQ(a, b) assert((a) == (b)) + +void +check() +{ + struct timespec tp = {0}; + + ASSERT_EQ(0, clock_gettime(CLOCK_REALTIME, &tp)); + ASSERT_EQ(0, clock_gettime(CLOCK_MONOTONIC, &tp)); + ASSERT_EQ(0, clock_gettime(CLOCK_BOOTTIME, &tp)); + ASSERT_EQ(0, clock_gettime(CLOCK_UPTIME, &tp)); + + + ASSERT_EQ(0, clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp)); + ASSERT_EQ(0, clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp)); + +} + +int main() +{ + check(); + return 0; +} diff --git a/regress/lib/libc/timekeep/test_gettimeofday.c b/regress/lib/libc/timekeep/test_gettimeofday.c new file mode 100644 index 00000000000..914058505dd --- /dev/null +++ b/regress/lib/libc/timekeep/test_gettimeofday.c @@ -0,0 +1,37 @@ +/* $OpenBSD: test_gettimeofday.c,v 1.1 2020/07/06 13:33:06 pirofti Exp $ */ +/* + * Copyright (c) 2020 Paul Irofti <paul@irofti.net> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <assert.h> +#include <sys/time.h> + +#define ASSERT_EQ(a, b) assert((a) == (b)) + +void +check() +{ + struct timeval tv = {0}; + struct timezone tzp; + + ASSERT_EQ(0, gettimeofday(&tv, NULL)); + ASSERT_EQ(0, gettimeofday(&tv, &tzp)); +} + +int main() +{ + check(); + return 0; +} diff --git a/regress/lib/libc/timekeep/test_time_skew.c b/regress/lib/libc/timekeep/test_time_skew.c new file mode 100644 index 00000000000..7871795f06b --- /dev/null +++ b/regress/lib/libc/timekeep/test_time_skew.c @@ -0,0 +1,55 @@ +/* $OpenBSD: test_time_skew.c,v 1.1 2020/07/06 13:33:06 pirofti Exp $ */ +/* + * Copyright (c) 2020 Paul Irofti <paul@irofti.net> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/time.h> + +#include <assert.h> +#include <time.h> +#include <stdlib.h> +#include <stdio.h> + +#define ASSERT_EQ(a, b) assert((a) == (b)) +#define ASSERT_NE(a, b) assert((a) != (b)) + +void +check() +{ + struct timespec tp1, tp2, tout; + + tout.tv_sec = 0; + tout.tv_nsec = 100000; + + ASSERT_EQ(0, clock_gettime(CLOCK_MONOTONIC, &tp1)); + + nanosleep(&tout, NULL); + + ASSERT_EQ(0, clock_gettime(CLOCK_MONOTONIC, &tp2)); + + /* tp1 should never be larger than tp2 */ + ASSERT_NE(1, timespeccmp(&tp1, &tp2, >)); +} + +int +main(void) +{ + int i; + + for (i = 0; i < 1000; i++) + check(); + + return 0; +} |