From patchwork Wed Apr 27 12:31:50 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jes Sorensen X-Patchwork-Id: 93038 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 7B86DB6EF3 for ; Wed, 27 Apr 2011 22:32:59 +1000 (EST) Received: from localhost ([::1]:45533 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QF3vN-00022V-5o for incoming@patchwork.ozlabs.org; Wed, 27 Apr 2011 08:32:57 -0400 Received: from eggs.gnu.org ([140.186.70.92]:35539) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QF3v8-000217-4H for qemu-devel@nongnu.org; Wed, 27 Apr 2011 08:32:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QF3v3-0005KA-Si for qemu-devel@nongnu.org; Wed, 27 Apr 2011 08:32:42 -0400 Received: from mx1.redhat.com ([209.132.183.28]:21242) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QF3v3-0005Jw-KK for qemu-devel@nongnu.org; Wed, 27 Apr 2011 08:32:37 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p3RCWZj4018444 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 27 Apr 2011 08:32:36 -0400 Received: from red-feather.redhat.com (ovpn-113-47.phx2.redhat.com [10.3.113.47]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p3RCWWIo026764; Wed, 27 Apr 2011 08:32:34 -0400 From: Jes.Sorensen@redhat.com To: kwolf@redhat.com Date: Wed, 27 Apr 2011 14:31:50 +0200 Message-Id: <1303907511-4092-2-git-send-email-Jes.Sorensen@redhat.com> In-Reply-To: <1303907511-4092-1-git-send-email-Jes.Sorensen@redhat.com> References: <1303907511-4092-1-git-send-email-Jes.Sorensen@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.132.183.28 Cc: qemu-devel@nongnu.org Subject: [Qemu-devel] [PATCH 1/2] Add dd-style SIGUSR1 progress reporting X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Jes Sorensen This introduces support for dd-style progress reporting on POSIX systems, if the user hasn't specified -p to report progress. If sent a SIGUSR1, qemu-img will report current progress for commands that support progress reporting. Signed-off-by: Jes Sorensen --- qemu-progress.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 48 insertions(+), 5 deletions(-) diff --git a/qemu-progress.c b/qemu-progress.c index 656e065..b4b751c 100644 --- a/qemu-progress.c +++ b/qemu-progress.c @@ -26,12 +26,15 @@ #include "osdep.h" #include "sysemu.h" #include +#include struct progress_state { int enabled; float current; float last_print; float min_skip; + void (*print)(void); + void (*end)(void); }; static struct progress_state state; @@ -51,20 +54,60 @@ static void progress_simple_print(void) 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 +127,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(); } }