Il 18/04/2013 20:47, Orr Dvory ha scritto: > is this better? Yes -- but I don't remember if this was fixed elsewhere. Can you reproduce the problem in 1.5.0? If so, please send the patch according to the guidelines at http://wiki.qemu.org/Contribute/SubmitAPatch.
Paolo > diff -uprN qemu-1.4.1/gdbstub.c qemu-1.4.1-fix/gdbstub.c > --- qemu-1.4.1/gdbstub.c 2013-04-15 23:25:18.000000000 +0300 > +++ qemu-1.4.1-fix/gdbstub.c 2013-04-18 21:35:00.000000000 +0300 > @@ -379,17 +379,22 @@ static void put_buffer(GDBState *s, cons > { > #ifdef CONFIG_USER_ONLY > int ret; > - > + int fd_flags = fcntl (s->fd, F_GETFL, 0); > + fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK); > while (len > 0) { > ret = send(s->fd, buf, len, 0); > if (ret < 0) { > > if (errno != EINTR && errno != EAGAIN) > + { > + fcntl (s->fd, F_SETFL, fd_flags); > return; > + } > } else { > buf += ret; > len -= ret; > } > } > + fcntl (s->fd, F_SETFL, fd_flags); > #else > qemu_chr_fe_write(s->chr, buf, len); > #endif > @@ -2775,6 +2780,7 @@ gdb_handlesig (CPUArchState *env, int si > GDBState *s; > char buf[256]; > int n; > + int fd_flags; > > s = gdbserver_state; > if (gdbserver_fd < 0 || s->fd < 0) > @@ -2793,7 +2799,8 @@ gdb_handlesig (CPUArchState *env, int si > connection. */ > if (s->fd < 0) > return sig; > - > + fd_flags = fcntl (s->fd, F_GETFL, 0); > + fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK); > sig = 0; > s->state = RS_IDLE; > s->running_state = 0; > @@ -2810,9 +2817,11 @@ gdb_handlesig (CPUArchState *env, int si > { > /* XXX: Connection closed. Should probably wait for another > connection before continuing. */ > + fcntl (s->fd, F_SETFL, fd_flags); > return sig; > } > } > + fcntl (s->fd, F_SETFL, fd_flags); > sig = s->signal; > s->signal = 0; > return sig; > > > On Thu, Apr 18, 2013 at 9:46 PM, Orr Dvory <gid...@gmail.com > <mailto:gid...@gmail.com>> wrote: > > is this better? > > diff -uprN qemu-1.4.1/gdbstub.c qemu-1.4.1-fix/gdbstub.c > --- qemu-1.4.1/gdbstub.c 2013-04-15 23:25:18.000000000 +0300 > +++ qemu-1.4.1-fix/gdbstub.c 2013-04-18 21:35:00.000000000 +0300 > @@ -379,17 +379,22 @@ static void put_buffer(GDBState *s, cons > { > #ifdef CONFIG_USER_ONLY > int ret; > - > + int fd_flags = fcntl (s->fd, F_GETFL, 0); > + fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK); > while (len > 0) { > ret = send(s->fd, buf, len, 0); > if (ret < 0) { > > if (errno != EINTR && errno != EAGAIN) > + { > + fcntl (s->fd, F_SETFL, fd_flags); > return; > + } > } else { > buf += ret; > len -= ret; > } > } > + fcntl (s->fd, F_SETFL, fd_flags); > #else > qemu_chr_fe_write(s->chr, buf, len); > #endif > @@ -2775,6 +2780,7 @@ gdb_handlesig (CPUArchState *env, int si > GDBState *s; > char buf[256]; > int n; > + int fd_flags; > > s = gdbserver_state; > if (gdbserver_fd < 0 || s->fd < 0) > @@ -2793,7 +2799,8 @@ gdb_handlesig (CPUArchState *env, int si > connection. */ > if (s->fd < 0) > return sig; > - > + fd_flags = fcntl (s->fd, F_GETFL, 0); > + fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK); > sig = 0; > s->state = RS_IDLE; > s->running_state = 0; > @@ -2810,9 +2817,11 @@ gdb_handlesig (CPUArchState *env, int si > { > /* XXX: Connection closed. Should probably wait for another > connection before continuing. */ > + fcntl (s->fd, F_SETFL, fd_flags); > return sig; > } > } > + fcntl (s->fd, F_SETFL, fd_flags); > sig = s->signal; > s->signal = 0; > return sig; > > > On Wed, Feb 20, 2013 at 10:38 PM, Paolo Bonzini <pbonz...@redhat.com > <mailto:pbonz...@redhat.com>> wrote: > > Il 20/02/2013 20:39, Orr Dvory ha scritto: > > if (errno != EINTR && errno != EAGAIN) > > + /* there's no need to restore the > > + O_NONBLOCK option. */ > > return; > > + > > But it's cleaner to do it anyway. :) > > Paolo > > >