summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArve Hjønnevåg <arve@android.com>2009-05-08 22:52:55 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2009-05-08 22:52:55 -0700
commit05abce16e1ce6d6e869b65c40a56e56fdfda3840 (patch)
tree8aca94a497ff1ce342de5128d9c6a5ba3e118444
parente09db60c180b0380811bc03ac2e2ff439cbe7e09 (diff)
parentfb96abdcfc53dc0c4ff0450c0afd192d6ba570c1 (diff)
downloadextras-05abce16e1ce6d6e869b65c40a56e56fdfda3840.tar.gz
am fb96abd: Bring timetest back.
Merge commit 'fb96abdcfc53dc0c4ff0450c0afd192d6ba570c1' * commit 'fb96abdcfc53dc0c4ff0450c0afd192d6ba570c1': Bring timetest back.
-rw-r--r--tests/timetest/Android.mk19
-rw-r--r--tests/timetest/timetest.c113
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;
+}