Changeset
include/qemu-common.h |  1 +
util/qemu-progress.c  | 22 +++++++++++++++++++---
2 files changed, 20 insertions(+), 3 deletions(-)
Git apply log
Switched to a new branch '1523864788-15800-1-git-send-email-zhenwei.pi@youruncloud.com'
Applying: qemu-progress: redirct qemu progress message to another file stream
To https://github.com/patchew-project/qemu
 * [new tag]         patchew/1523864788-15800-1-git-send-email-zhenwei.pi@youruncloud.com -> patchew/1523864788-15800-1-git-send-email-zhenwei.pi@youruncloud.com
Test passed: checkpatch

loading

Test passed: docker-mingw@fedora

loading

Test passed: docker-build@min-glib

loading

Test passed: s390x

loading

[Qemu-devel] [PATCH] qemu-progress: redirct qemu progress message to another file stream
Posted by zhenwei pi, 13 weeks ago
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(-)

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.
-- 
2.7.4


Re: [Qemu-devel] [PATCH] qemu-progress: redirct qemu progress message to another file stream
Posted by Max Reitz, 12 weeks ago
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.
> 


Re: [Qemu-devel] [PATCH] qemu-progress: redirct qemu progress message to another file stream
Posted by Zhenwei.Pi, 12 weeks ago
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.
>>
>