diff options
| -rw-r--r-- | modules/benchmark.c | 73 | 
1 files changed, 63 insertions, 10 deletions
| diff --git a/modules/benchmark.c b/modules/benchmark.c index 0f5e7ea6..9cc7e0b8 100644 --- a/modules/benchmark.c +++ b/modules/benchmark.c @@ -330,6 +330,17 @@ static void br_mi_add(char **results_list, bench_result *b, gboolean select) {      g_free(rkey);  } +gint bench_result_sort (gconstpointer a, gconstpointer b) { +    bench_result +        *A = (bench_result*)a, +        *B = (bench_result*)b; +    if ( A->bvalue.result < B->bvalue.result ) +        return -1; +    if ( A->bvalue.result > B->bvalue.result ) +        return 1; +    return 0; +} +  static gchar *__benchmark_include_results(bench_value r,  					  const gchar * benchmark,  					  ShellOrderType order_type) @@ -337,18 +348,21 @@ static gchar *__benchmark_include_results(bench_value r,      bench_result *b = NULL;      GKeyFile *conf;      gchar **machines; -    gchar *path, *results = g_strdup(""), *return_value, *processor_frequency, *processor_name; -    int i, n_threads; +    gchar *path, *results = g_strdup(""); +    int i, len, loc, win_min, win_max, win_size = 10; + +    GSList *result_list = NULL, *li = NULL;      moreinfo_del_with_prefix("BENCH"); +    /* this result */      if (r.result > 0.0) {          b = bench_result_this_machine(benchmark, r); -        br_mi_add(&results, b, 1); +        result_list = g_slist_append(result_list, b);      } +    /* load saved results */      conf = g_key_file_new(); -      path = g_build_filename(g_get_user_config_dir(), "hardinfo", "benchmark.conf", NULL);      if (!g_file_test(path, G_FILE_TEST_EXISTS)) {          DEBUG("local benchmark.conf not found, trying system-wide"); @@ -365,11 +379,9 @@ static gchar *__benchmark_include_results(bench_value r,          bench_result *sbr;          values = g_key_file_get_string_list(conf, benchmark, machines[i], NULL, NULL); -          sbr = bench_result_benchmarkconf(benchmark, machines[i], values); -        br_mi_add(&results, sbr, 0); +        result_list = g_slist_append(result_list, sbr); -        bench_result_free(sbr);          g_strfreev(values);      } @@ -377,7 +389,50 @@ static gchar *__benchmark_include_results(bench_value r,      g_free(path);      g_key_file_free(conf); -    return_value = g_strdup_printf("[$ShellParam$]\n" +    /* sort */ +    result_list = g_slist_sort(result_list, bench_result_sort); +    if (order_type == SHELL_ORDER_DESCENDING) +        result_list = g_slist_reverse(result_list); + +    /* limit results to those near the current result */ +    len = g_slist_length(result_list); +    if (win_size == 0) win_size = 1; +    if (win_size < 0) win_size = len; +    loc = g_slist_index(result_list, b); /* -1 if not found */ +    if (loc >= 0) { +        win_min = loc - win_size/2; +        win_max = win_min + win_size; +        if (win_min < 0) { +            win_min = 0; +            win_max = MIN(win_size, len); +        } else if (win_max > len) { +            win_max = len; +            win_min = MAX(len - win_size, 0); +        } +    } else { +        win_min = 0; +        win_max = len; +    } + +    DEBUG("...len: %d, loc: %d, win_size: %d, win: [%d..%d]\n", +        len, loc, win_size, win_min, win_max-1 ); + +    /* prepare for shell */ +    i = 0; +    li = result_list; +    while (li) { +        bench_result *tr = (bench_result*)li->data; +        if (i >= win_min && i < win_max) +            br_mi_add(&results, tr, (tr == b) ? 1 : 0 ); +        bench_result_free(tr); /* no longer needed */ +        i++; +        li = g_slist_next(li); +    } + +    g_slist_free(result_list); + +    /* send to shell */ +    return g_strdup_printf("[$ShellParam$]\n"                     "Zebra=1\n"                     "OrderType=%d\n"                     "ViewType=4\n" @@ -390,8 +445,6 @@ static gchar *__benchmark_include_results(bench_value r,                     _("CPU Config"), _("Results"), _("CPU"),                     benchmark, results); -    bench_result_free(b); -    return return_value;  }  static gchar *benchmark_include_results_reverse(bench_value result, const gchar * benchmark) | 
