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 Thu, Apr 18, 2013 at 9:46 PM, Orr Dvory <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>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 >> > >