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; > }