tools/how-to-type: add --keysym for how to type a keysym
[platform/upstream/libxkbcommon.git] / bench / bench.c
index 9bb535c..c28ac65 100644 (file)
  * DEALINGS IN THE SOFTWARE.
  */
 
-#if defined(HAVE_CLOCK_GETTIME)
-#define USE_CLOCK_GETTIME
-#include <time.h>
-#elif defined(__MACH__) && __MACH__ == 1
-#define USE_MACH_ABSOLUTE_TIME
-#include <mach/mach_time.h>
-#else
-/* gettimeofday() - a last resort */
-#include <sys/time.h>
-#endif
+#include "config.h"
 
-#include <stdlib.h>
-#include <string.h>
+#include <assert.h>
 #include <stdio.h>
 
 #include "bench.h"
+#include "../src/utils.h"
 
-static void
-set_bench_time(struct bench_time *dest, long seconds, long milliseconds)
-{
-    dest->seconds = seconds;
-    dest->milliseconds = milliseconds;
-}
-
-static void
-normalize_bench_time(struct bench_time *obj)
-{
-    if (obj->milliseconds >= 0) {
-        return;
-    }
-    obj->milliseconds += 1000000;
-    obj->seconds--;
-}
+#ifndef _MSC_VER
+#include <sys/time.h>
+#else
+#include <windows.h>
+#include <stdint.h>
 
-void
-bench_timer_reset(struct bench_timer *self)
-{
-#if defined(USE_MACH_ABSOLUTE_TIME)
-    mach_timebase_info_data_t info;
-    if (mach_timebase_info(&info) == 0) {
-        self->scaling_factor = info.numer / info.denom;
-    }
-#endif
-    self->start.seconds = 0L;
-    self->start.milliseconds = 0L;
-    self->stop.seconds = 0L;
-    self->stop.milliseconds = 0L;
-}
+struct timeval {
+    long tv_sec, tv_usec;
+};
 
-void
-bench_timer_start(struct bench_timer *self)
+static int
+gettimeofday(struct timeval *tv, void *unused)
 {
-#if defined(USE_CLOCK_GETTIME)
-    struct timespec val;
+    static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL);
 
-    (void)clock_gettime(CLOCK_MONOTONIC, &val);
+    SYSTEMTIME system_time;
+    FILETIME file_time;
+    uint64_t t;
 
-    /* With conversion from nanosecond to millisecond */
-    set_bench_time(&self->start, val.tv_sec, val.tv_nsec / 1000);
-#elif defined(USE_MACH_ABSOLUTE_TIME)
-    uint64_t val;
+    GetSystemTime(&system_time);
+    SystemTimeToFileTime(&system_time, &file_time);
+    t = (uint64_t) file_time.dwLowDateTime;
+    t += ((uint64_t) file_time.dwHighDateTime) << 32;
 
-    val = mach_absolute_time();
+    tv->tv_sec  = (long) ((t - EPOCH) / 10000000L);
+    tv->tv_usec = (long) (system_time.wMilliseconds * 1000);
+    return 0;
+}
+#endif
 
-    /* With conversion from nanosecond to millisecond */
-    set_bench_time(&self->start,
-                   self->scaling_factor * val / 1000000000,
-                   self->scaling_factor * val % 1000000000 / 1000);
-#else
+void
+bench_start(struct bench *bench)
+{
     struct timeval val;
-
-    (void)gettimeofday(&val, NULL);
-
-    set_bench_time(&self->start, val.tv_sec, val.tv_usec);
-#endif
+    (void) gettimeofday(&val, NULL);
+    bench->start = (struct bench_time) {
+        .seconds = val.tv_sec,
+        .microseconds = val.tv_usec,
+    };
 }
 
 void
-bench_timer_stop(struct bench_timer *self)
+bench_stop(struct bench *bench)
 {
-#if defined(USE_CLOCK_GETTIME)
-    struct timespec val;
-
-    (void)clock_gettime(CLOCK_MONOTONIC, &val);
-
-    /* With conversion from nanosecond to millisecond */
-    set_bench_time(&self->stop, val.tv_sec, val.tv_nsec / 1000);
-#elif defined(USE_MACH_ABSOLUTE_TIME)
-    uint64_t val;
-
-    val = mach_absolute_time();
-
-    /* With conversion from nanosecond to millisecond */
-    set_bench_time(&self->stop,
-                   self->scaling_factor * val / 1000000000,
-                   self->scaling_factor * val % 1000000000 / 1000);
-#else
     struct timeval val;
-
-    (void)gettimeofday(&val, NULL);
-
-    set_bench_time(&self->stop, val.tv_sec, val.tv_usec);
-#endif
+    (void) gettimeofday(&val, NULL);
+    bench->stop = (struct bench_time) {
+        .seconds = val.tv_sec,
+        .microseconds = val.tv_usec,
+    };
 }
 
 void
-bench_timer_get_elapsed_time(struct bench_timer *self, struct bench_time *result)
+bench_elapsed(const struct bench *bench, struct bench_time *result)
 {
-    result->seconds = self->stop.seconds - self->start.seconds;
-    result->milliseconds = self->stop.milliseconds - self->start.milliseconds;
+    result->seconds = bench->stop.seconds - bench->start.seconds;
+    result->microseconds = bench->stop.microseconds - bench->start.microseconds;
+    if (result->microseconds < 0) {
+        result->microseconds += 1000000;
+        result->seconds--;
+    }
 }
 
 char *
-bench_timer_get_elapsed_time_str(struct bench_timer *self)
+bench_elapsed_str(const struct bench *bench)
 {
     struct bench_time elapsed;
     char *buf;
+    int ret;
 
-    bench_timer_get_elapsed_time(self, &elapsed);
-    normalize_bench_time(&elapsed);
-    asprintf(&buf, "%ld.%06ld", elapsed.seconds, elapsed.milliseconds);
+    bench_elapsed(bench, &elapsed);
+    ret = asprintf(&buf, "%ld.%06ld", elapsed.seconds, elapsed.microseconds);
+    assert(ret >= 0);
 
     return buf;
 }