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 <[email protected]> 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 <[email protected]>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
>>
>
>