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

Reply via email to