diff options
author | Leandro Pereira <leandro@hardinfo.org> | 2009-12-26 20:50:15 -0200 |
---|---|---|
committer | Leandro Pereira <leandro@hardinfo.org> | 2009-12-26 20:50:15 -0200 |
commit | 9c21351114bcbaec4b8c5fe8531e82d9b9fbc711 (patch) | |
tree | e0666ff10d57da9a01ddde6c00a95e598a24d885 /hardinfo2 | |
parent | 1a3212a6978e908ef73ad220a7a43c5d3b64dc23 (diff) |
Make benchmarks cancellable
Diffstat (limited to 'hardinfo2')
-rw-r--r-- | hardinfo2/benchmark.c | 76 |
1 files changed, 63 insertions, 13 deletions
diff --git a/hardinfo2/benchmark.c b/hardinfo2/benchmark.c index fd965f48..53f8baf1 100644 --- a/hardinfo2/benchmark.c +++ b/hardinfo2/benchmark.c @@ -25,6 +25,9 @@ #include <sys/time.h> #include <sys/resource.h> +#include <sys/types.h> +#include <signal.h> + enum { BENCHMARK_BLOWFISH, BENCHMARK_CRYPTOHASH, @@ -305,11 +308,17 @@ gchar *callback_fib() "CPU Fibonacci"); } +typedef struct _BenchmarkDialog BenchmarkDialog; +struct _BenchmarkDialog { + GtkWidget *dialog; + double result; +}; + static gboolean do_benchmark_handler(GIOChannel *source, GIOCondition condition, gpointer data) { - double *result_ret = (double *)data; + BenchmarkDialog *bench_dialog = (BenchmarkDialog*)data; GIOStatus status; gchar *result; @@ -317,15 +326,14 @@ static gboolean do_benchmark_handler(GIOChannel *source, if (status != G_IO_STATUS_NORMAL) { DEBUG("error while reading benchmark result"); - *result_ret = 0.0f; - gtk_main_quit(); + bench_dialog->result = 0.0f; + gtk_widget_destroy(bench_dialog->dialog); return FALSE; } - *result_ret = atof(result); - + bench_dialog->result = atof(result); + gtk_widget_destroy(bench_dialog->dialog); g_free(result); - gtk_main_quit(); return FALSE; } @@ -337,38 +345,74 @@ static void do_benchmark(void (*benchmark_function)(void), int entry) if (params.gui_running) { gchar *argv[] = { params.argv0, "-b", entries[entry].name, "-m", "benchmark.so", "-a", NULL }; + GPid bench_pid; gint bench_stdout; + GtkWidget *bench_dialog; + GtkWidget *bench_image; + BenchmarkDialog *benchmark_dialog; shell_view_set_enabled(FALSE); - shell_status_update("Benchmarking. Please avoid any I/O."); + shell_status_update("Benchmarking."); + + bench_image = icon_cache_get_image("benchmark.png"); + gtk_widget_show(bench_image); + + bench_dialog = gtk_message_dialog_new(GTK_WINDOW(shell_get_main_shell()->window), + GTK_DIALOG_MODAL, + GTK_MESSAGE_INFO, + GTK_BUTTONS_NONE, + "Benchmarking. Please do not move your mouse " \ + "or press any keys."); + g_object_set_data(G_OBJECT(bench_dialog), "result", "0.0"); + gtk_dialog_add_buttons(GTK_DIALOG(bench_dialog), + "Cancel", GTK_RESPONSE_ACCEPT, NULL); + gtk_message_dialog_set_image(GTK_MESSAGE_DIALOG(bench_dialog), bench_image); + while (gtk_events_pending()) { gtk_main_iteration(); } + benchmark_dialog = g_new0(BenchmarkDialog, 1); + benchmark_dialog->dialog = bench_dialog; + if (g_spawn_async_with_pipes(NULL, argv, NULL, G_SPAWN_STDERR_TO_DEV_NULL, NULL, NULL, - NULL, + &bench_pid, NULL, &bench_stdout, NULL, NULL)) { GIOChannel *channel; - double result; + guint watch_id; channel = g_io_channel_unix_new(bench_stdout); - g_io_add_watch(channel, G_IO_IN, do_benchmark_handler, &result); + watch_id = g_io_add_watch(channel, G_IO_IN, do_benchmark_handler, benchmark_dialog); - gtk_main(); + switch (gtk_dialog_run(GTK_DIALOG(bench_dialog))) { + case GTK_RESPONSE_NONE: + DEBUG("benchmark finished"); + break; + case GTK_RESPONSE_ACCEPT: + DEBUG("cancelling benchmark"); + + g_source_remove(watch_id); + kill(bench_pid, SIGINT); + } - bench_results[entry] = result; + bench_results[entry] = benchmark_dialog->result; + gtk_widget_destroy(bench_dialog); g_io_channel_unref(channel); shell_status_set_enabled(TRUE); + g_free(benchmark_dialog); + shell_status_update("Done."); return; } + gtk_widget_destroy(bench_dialog); + g_free(benchmark_dialog); shell_status_set_enabled(TRUE); shell_status_update("Done."); } @@ -382,7 +426,13 @@ void scan_gui(gboolean reload) { SCAN_START(); - if (params.gui_running) { + if (params.run_benchmark) { + int argc = 0; + + ui_init(&argc, NULL); + } + + if (params.gui_running || params.run_benchmark) { do_benchmark(benchmark_gui, BENCHMARK_GUI); } else { bench_results[BENCHMARK_GUI] = 0.0f; |