diff options
author | Arve Hjønnevåg <arve@android.com> | 2009-05-08 22:52:55 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-05-08 22:52:55 -0700 |
commit | 05abce16e1ce6d6e869b65c40a56e56fdfda3840 (patch) | |
tree | 8aca94a497ff1ce342de5128d9c6a5ba3e118444 | |
parent | e09db60c180b0380811bc03ac2e2ff439cbe7e09 (diff) | |
parent | fb96abdcfc53dc0c4ff0450c0afd192d6ba570c1 (diff) | |
download | extras-05abce16e1ce6d6e869b65c40a56e56fdfda3840.tar.gz |
am fb96abd: Bring timetest back.
Merge commit 'fb96abdcfc53dc0c4ff0450c0afd192d6ba570c1'
* commit 'fb96abdcfc53dc0c4ff0450c0afd192d6ba570c1':
Bring timetest back.
-rw-r--r-- | tests/timetest/Android.mk | 19 | ||||
-rw-r--r-- | tests/timetest/timetest.c | 113 |
2 files changed, 132 insertions, 0 deletions
diff --git a/tests/timetest/Android.mk b/tests/timetest/Android.mk new file mode 100644 index 00000000..918dea18 --- /dev/null +++ b/tests/timetest/Android.mk @@ -0,0 +1,19 @@ +# Copyright 2006 The Android Open Source Project + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES:= timetest.c + +LOCAL_MODULE:= timetest + +LOCAL_MODULE_TAGS := tests + +LOCAL_FORCE_STATIC_EXECUTABLE := true +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN) +LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_SBIN_UNSTRIPPED) + +LOCAL_STATIC_LIBRARIES := libc + +include $(BUILD_EXECUTABLE) + diff --git a/tests/timetest/timetest.c b/tests/timetest/timetest.c new file mode 100644 index 00000000..baba36e2 --- /dev/null +++ b/tests/timetest/timetest.c @@ -0,0 +1,113 @@ +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/limits.h> +#include <sys/time.h> +#include <time.h> +#include <errno.h> + +#include <string.h> + + + +long long nanotime(void) +{ + struct timespec t; + + if(clock_gettime(CLOCK_MONOTONIC, &t)) { + fprintf(stderr,"clock failure\n"); + exit(1); + } + + return (((long long) t.tv_sec) * 1000000000LL) + + ((long long) t.tv_nsec); +} + +static struct timespec ts_sub(struct timespec a, struct timespec b) +{ + struct timespec r; + r.tv_sec = a.tv_sec - b.tv_sec; + r.tv_nsec = a.tv_nsec - b.tv_nsec; + if(r.tv_nsec < 0) { + r.tv_sec--; + r.tv_nsec += 1000 * 1000 * 1000; + } + if(r.tv_sec < 0 && r.tv_nsec > 0) { + r.tv_sec++; + r.tv_nsec -= 1000 * 1000 * 1000; + } + return r; +} + +static struct timespec ts_min(struct timespec a, struct timespec b) +{ + if(a.tv_sec < b.tv_sec || (a.tv_sec == b.tv_sec && a.tv_nsec < b.tv_nsec)) + return a; + else + return b; +} + +static struct timespec ts_max(struct timespec a, struct timespec b) +{ + if(a.tv_sec < b.tv_sec || (a.tv_sec == b.tv_sec && a.tv_nsec < b.tv_nsec)) + return b; + else + return a; +} + +int main(int argc, char **argv) +{ + long long tnow, tlast; + struct timespec t1, dtmin, dtminp, dtmax; + int print_interval = 50000; + int print_countdown = 1; + int clock_id = CLOCK_MONOTONIC; + dtmin.tv_sec = INT_MAX; + dtmin.tv_nsec = 0; + dtminp.tv_sec = INT_MAX; + dtminp.tv_nsec = 0; + dtmax.tv_sec = 0; + dtmax.tv_nsec = 0; + tlast = 0; + + if(argc == 2) { + clock_id = atoi(argv[1]); + printf("using clock %d\n", clock_id); + } + clock_gettime(clock_id, &t1); + + for(;;) { + struct timespec t, dt; + clock_gettime(clock_id, &t); + dt = ts_sub(t, t1); + t1 = t; + dtmin = ts_min(dtmin, dt); + if(dt.tv_sec > 0 || dt.tv_nsec > 0) + dtminp = ts_min(dtminp, dt); + if(print_countdown != print_interval) + dtmax = ts_max(dtmax, dt); + if(--print_countdown == 0) { + fprintf(stderr,"%09ld.%09ld, dt %ld.%09ld, min %ld.%09ld, minp %ld.%09ld, max %ld.%09ld\n", + t.tv_sec, t.tv_nsec, dt.tv_sec, dt.tv_nsec, + dtmin.tv_sec, dtmin.tv_nsec, dtminp.tv_sec, dtminp.tv_nsec, + dtmax.tv_sec, dtmax.tv_nsec); + print_countdown = print_interval; + } + } + for(;;) { + tnow = nanotime(); + if(tnow < tlast) { +#if 0 + fprintf(stderr,"time went backwards: %lld -> %lld\n", + tlast, tnow); + exit(1); +#endif + fprintf(stderr,"%lld ROLLBACK\n", tnow); + } else { + fprintf(stderr,"%lld\n", tnow); + } + tlast = tnow; + } + + return 0; +} |