Message ID | 1523864788-15800-1-git-send-email-zhenwei.pi@youruncloud.com |
---|---|
State | New |
Headers | show |
Series | qemu-progress: redirct qemu progress message to another file stream | expand |
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 <zhenwei.pi@youruncloud.com> > --- > 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... > 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 0 > diff --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 > } > > 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. >
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 <zhenwei.pi@youruncloud.com> >> --- >> 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 0 >> diff --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. >> >
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 0 diff --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); } 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.
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 <zhenwei.pi@youruncloud.com> --- include/qemu-common.h | 1 + util/qemu-progress.c | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-)