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;