diff options
author | Aurelien Jarno <aurelien@aurel32.net> | 2011-04-27 16:26:18 +0200 |
---|---|---|
committer | Aurelien Jarno <aurelien@aurel32.net> | 2011-04-27 16:26:18 +0200 |
commit | aa348082d8e89d2ab021caadbcc97c93038fffb2 (patch) | |
tree | 2925d93352e37255827b17b98aa8cee1a6a6a69f /qemu-progress.c | |
parent | c6a0487b1fc29bc6047da0e484f79d4d627f9018 (diff) | |
parent | df6e008a8814af9db872f1319b58784d87987c93 (diff) |
Merge branch 'for-anthony' of git://repo.or.cz/qemu/kevin
* 'for-anthony' of git://repo.or.cz/qemu/kevin:
Remove obsolete 'enabled' variable from progress state
Add dd-style SIGUSR1 progress reporting
qed: Fix consistency check on 32-bit hosts
ide/atapi: Introduce CHECK_READY flag for commands
ide/atapi: Replace bdrv_get_geometry calls by s->nb_sectors
ide/atapi: Use table instead of switch for commands
ide/atapi: Factor commands out
ide: Split atapi.c out
Improve accuracy of block migration bandwidth calculation
atapi: Add 'medium ready' to 'medium not ready' transition on cd change
qemu-img: allow rebase to a NULL backing file when unsafe
Diffstat (limited to 'qemu-progress.c')
-rw-r--r-- | qemu-progress.c | 61 |
1 files changed, 50 insertions, 11 deletions
diff --git a/qemu-progress.c b/qemu-progress.c index 656e065b1d..e1feb89614 100644 --- a/qemu-progress.c +++ b/qemu-progress.c @@ -26,12 +26,14 @@ #include "osdep.h" #include "sysemu.h" #include <stdio.h> +#include <signal.h> struct progress_state { - int enabled; float current; float last_print; float min_skip; + void (*print)(void); + void (*end)(void); }; static struct progress_state state; @@ -43,28 +45,65 @@ static struct progress_state state; */ static void progress_simple_print(void) { - if (state.enabled) { - printf(" (%3.2f/100%%)\r", state.current); - fflush(stdout); - } + printf(" (%3.2f/100%%)\r", state.current); + fflush(stdout); } static void progress_simple_end(void) { - if (state.enabled) { - printf("\n"); - } + printf("\n"); +} + +static void progress_simple_init(void) +{ + state.print = progress_simple_print; + state.end = progress_simple_end; +} + +#ifdef CONFIG_POSIX +static void sigusr_print(int signal) +{ + printf(" (%3.2f/100%%)\n", state.current); +} +#endif + +static void progress_dummy_print(void) +{ +} + +static void progress_dummy_end(void) +{ +} + +static void progress_dummy_init(void) +{ +#ifdef CONFIG_POSIX + struct sigaction action; + + memset(&action, 0, sizeof(action)); + sigfillset(&action.sa_mask); + action.sa_handler = sigusr_print; + action.sa_flags = 0; + sigaction(SIGUSR1, &action, NULL); +#endif + + state.print = progress_dummy_print; + state.end = progress_dummy_end; } void qemu_progress_init(int enabled, float min_skip) { - state.enabled = enabled; state.min_skip = min_skip; + if (enabled) { + progress_simple_init(); + } else { + progress_dummy_init(); + } } void qemu_progress_end(void) { - progress_simple_end(); + state.end(); } void qemu_progress_print(float percent, int max) @@ -84,6 +123,6 @@ void qemu_progress_print(float percent, int max) if (current > (state.last_print + state.min_skip) || (current == 100) || (current == 0)) { state.last_print = state.current; - progress_simple_print(); + state.print(); } } |