On Tue, 06/03 18:39, Paolo Bonzini wrote:
> diff --git a/qemu-char.c b/qemu-char.c
> index b478a3d..dcd0765 100644
> --- a/qemu-char.c
> +++ b/qemu-char.c
> @@ -121,7 +121,12 @@ void qemu_chr_be_generic_open(CharDriverState *s)
>  
>  int qemu_chr_fe_write(CharDriverState *s, const uint8_t *buf, int len)
>  {
> -    return s->chr_write(s, buf, len);
> +    int ret;
> +
> +    qemu_mutex_lock(&s->chr_write_lock);
> +    ret = s->chr_write(s, buf, len);
> +    qemu_mutex_unlock(&s->chr_write_lock);
> +    return ret;
>  }
>  
>  int qemu_chr_fe_write_all(CharDriverState *s, const uint8_t *buf, int len)
> @@ -129,6 +134,7 @@ int qemu_chr_fe_write_all(CharDriverState *s, const 
> uint8_t *buf, int len)
>      int offset = 0;
>      int res;
>  
> +    qemu_mutex_lock(&s->chr_write_lock);
>      while (offset < len) {
>          do {
>              res = s->chr_write(s, buf + offset, len - offset);
> @@ -147,6 +153,7 @@ int qemu_chr_fe_write_all(CharDriverState *s, const 
> uint8_t *buf, int len)

More context in the loop:

              if (res == -1 && errno == EAGAIN) {
                  g_usleep(100);
              }
          } while (res == -1 && errno == EAGAIN);

          if (res == 0) {
              break;
          }

          if (res < 0) {
(*)           return res;
          }

Doesn't (*) need an unlock?


Fam
>  
>          offset += res;
>      }
> +    qemu_mutex_unlock(&s->chr_write_lock);
>  
>      return offset;
>  }

Reply via email to