|
From: | Zhenwei.Pi |
Subject: | Re: [Qemu-devel] [PATCH] qemu-progress: redirct qemu progress message to another file stream |
Date: | Thu, 19 Apr 2018 09:00:37 +0800 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 |
On 04/18/2018 09:06 PM, Max Reitz wrote:
On 2018-04-16 09:46, zhenwei pi wrote:currently qemu progress message only print into stdout, and other thread may print some log into stdout at the same time. add a new api qemu_progress_set_output to redirect progress message to another file stream. Signed-off-by: zhenwei pi <address@hidden> --- include/qemu-common.h | 1 + util/qemu-progress.c | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-)Well, but after this patch, qemu will still only print progress to stdout because qemu_progress_set_output() isn't used anywhere...
this patch only provides the basic redirection function. if this patch is approved, another patch (Ex, qemu convert progress in qemu-img.c) will be send.
diff --git a/include/qemu-common.h b/include/qemu-common.h index 8a4f63c..511e7e0 100644 --- a/include/qemu-common.h +++ b/include/qemu-common.h @@ -128,6 +128,7 @@ ssize_t qemu_co_send_recv(int sockfd, void *buf, size_t bytes, bool do_send); void qemu_progress_init(int enabled, float min_skip); void qemu_progress_end(void); void qemu_progress_print(float delta, int max); +int qemu_progress_set_output(FILE *output); const char *qemu_get_vm_name(void);#define QEMU_FILE_TYPE_BIOS 0diff --git a/util/qemu-progress.c b/util/qemu-progress.c index 3c2223c..dd7aa52 100644 --- a/util/qemu-progress.c +++ b/util/qemu-progress.c @@ -31,6 +31,7 @@ struct progress_state { float min_skip; void (*print)(void); void (*end)(void); + FILE *output; };static struct progress_state state;@@ -43,17 +44,18 @@ static volatile sig_atomic_t print_pending; */ static void progress_simple_print(void) { - printf(" (%3.2f/100%%)\r", state.current); - fflush(stdout); + fprintf(state.output, " (%3.2f/100%%)\r", state.current); + fflush(state.output);Also, I'm not sure we should use \r when printing to anything but stdout. Max
qemu redirects progress message into a file, other process reads the file and uses '\r' to split the string, and we can get the progress exactly.
}static void progress_simple_end(void){ - printf("\n"); + fprintf(state.output, "\n"); }static void progress_simple_init(void){ + state.output = stdout; state.print = progress_simple_print; state.end = progress_simple_end; } @@ -129,6 +131,20 @@ void qemu_progress_end(void) }/*+ * Redirect progress into another file stream. + * @output is the new file stream. + */ +int qemu_progress_set_output(FILE *output) +{ + if (!output) { + return -EINVAL; + } + + state.output = output; + return 0; +} + +/* * Report progress. * @delta is how much progress we made. * If @max is zero, @delta is an absolut value of the total job done.
[Prev in Thread] | Current Thread | [Next in Thread] |