16f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin/*
26f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * Copyright © 2012 Ran Benita <ran234@gmail.com>
36f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin *
46f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * Permission is hereby granted, free of charge, to any person obtaining a
56f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * copy of this software and associated documentation files (the "Software"),
66f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * to deal in the Software without restriction, including without limitation
76f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * the rights to use, copy, modify, merge, publish, distribute, sublicense,
86f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * and/or sell copies of the Software, and to permit persons to whom the
96f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * Software is furnished to do so, subject to the following conditions:
106f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin *
116f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * The above copyright notice and this permission notice (including the next
126f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * paragraph) shall be included in all copies or substantial portions of the
136f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * Software.
146f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin *
156f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
166f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
176f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
186f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
196f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
206f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
216f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin * DEALINGS IN THE SOFTWARE.
226f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin */
236f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
246f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin#include <stdlib.h>
256f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin#include <time.h>
266f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
276f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin#include "../test/test.h"
286f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
296f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin#define BENCHMARK_ITERATIONS 20000000
306f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
316f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempinstatic void
326f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempinbench(struct xkb_state *state)
336f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin{
346f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    int8_t keys[256] = { 0 };
356f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    xkb_keycode_t keycode;
366f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    xkb_keysym_t keysym;
376f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    int i;
386f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
396f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    for (i = 0; i < BENCHMARK_ITERATIONS; i++) {
406f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin        keycode = (rand() % (255 - 9)) + 9;
416f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin        if (keys[keycode]) {
426f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin            xkb_state_update_key(state, keycode, XKB_KEY_UP);
436f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin            keys[keycode] = 0;
446f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin            keysym = xkb_state_key_get_one_sym(state, keycode);
456f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin            (void) keysym;
466f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin        } else {
476f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin            xkb_state_update_key(state, keycode, XKB_KEY_DOWN);
486f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin            keys[keycode] = 1;
496f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin        }
506f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    }
516f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin}
526f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
536f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempinint
546f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempinmain(void)
556f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin{
566f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    struct xkb_context *ctx;
576f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    struct xkb_keymap *keymap;
586f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    struct xkb_state *state;
596f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    struct timespec start, stop, elapsed;
606f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
616f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    ctx = test_get_context(0);
626f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    assert(ctx);
636f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
646f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    keymap = test_compile_rules(ctx, "evdev", "pc104", "us,ru,il,de",
656f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin                                ",,,neo", "grp:menu_toggle");
666f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    assert(keymap);
676f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
686f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    state = xkb_state_new(keymap);
696f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    assert(state);
706f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
716f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    xkb_context_set_log_level(ctx, XKB_LOG_LEVEL_CRITICAL);
726f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    xkb_context_set_log_verbosity(ctx, 0);
736f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
746f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    srand(time(NULL));
756f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
766f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    clock_gettime(CLOCK_MONOTONIC, &start);
776f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    bench(state);
786f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    clock_gettime(CLOCK_MONOTONIC, &stop);
796f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
806f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    elapsed.tv_sec = stop.tv_sec - start.tv_sec;
816f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    elapsed.tv_nsec = stop.tv_nsec - start.tv_nsec;
826f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    if (elapsed.tv_nsec < 0) {
836f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin        elapsed.tv_nsec += 1000000000;
846f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin        elapsed.tv_sec--;
856f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    }
866f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
876f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    fprintf(stderr, "ran %d iterations in %ld.%09lds\n",
886f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin            BENCHMARK_ITERATIONS, elapsed.tv_sec, elapsed.tv_nsec);
896f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
906f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    xkb_state_unref(state);
916f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    xkb_keymap_unref(keymap);
926f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    xkb_context_unref(ctx);
936f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin
946f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin    return 0;
956f36ec3ef7a87f9eaa37fc78868dbac2cb958b0Dennis Kempin}
96