2009-11-13 Kazu Hirata <kazu@codesourcery.com>
authorDaniel Jacobowitz <drow@false.org>
Fri, 13 Nov 2009 22:36:30 +0000 (22:36 +0000)
committerDaniel Jacobowitz <drow@false.org>
Fri, 13 Nov 2009 22:36:30 +0000 (22:36 +0000)
    Maxim Kuvyrkov  <maxim@codesourcery.com>

* remote-fileio.c (remote_fileio_request): Send Ctrl-C if it is
pending.
* remote-fileio.h: Update the prototype for remote_fileio_request.
* remote.c (struct remote_state): Add ctrlc_pending_p.
(remote_open_1): Clear ctrlc_pending_p.
(remote_stop_as): Set ctrlc_pending_p to 1.
(remote_wait_as): Pass ctrlc_pending_p to remote_fileio_request.

gdb/ChangeLog
gdb/remote-fileio.c
gdb/remote-fileio.h
gdb/remote.c

index f689b05..714b8af 100644 (file)
@@ -1,3 +1,14 @@
+2009-11-13  Kazu Hirata  <kazu@codesourcery.com>
+           Maxim Kuvyrkov  <maxim@codesourcery.com>
+
+       * remote-fileio.c (remote_fileio_request): Send Ctrl-C if it is
+       pending.
+       * remote-fileio.h: Update the prototype for remote_fileio_request.
+       * remote.c (struct remote_state): Add ctrlc_pending_p.
+       (remote_open_1): Clear ctrlc_pending_p.
+       (remote_stop_as): Set ctrlc_pending_p to 1.
+       (remote_wait_as): Pass ctrlc_pending_p to remote_fileio_request.
+
 2009-11-13  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * arm-tdep.c (arm_skip_stub): Recognize RealView veneer functions.
index 31ee244..22311ba 100644 (file)
@@ -1416,28 +1416,44 @@ remote_fileio_reset (void)
     }
 }
 
+/* Handle a file I/O request. BUF points to the packet containing the
+   request. CTRLC_PENDING_P should be nonzero if the target has not
+   acknowledged the Ctrl-C sent asynchronously earlier.  */
+
 void
-remote_fileio_request (char *buf)
+remote_fileio_request (char *buf, int ctrlc_pending_p)
 {
   int ex;
 
   remote_fileio_sig_init ();
 
-  remote_fio_ctrl_c_flag = 0;
-  remote_fio_no_longjmp = 0;
-
-  ex = catch_exceptions (uiout, do_remote_fileio_request, (void *)buf,
-                        RETURN_MASK_ALL);
-  switch (ex)
+  if (ctrlc_pending_p)
     {
-      case RETURN_ERROR:
-       remote_fileio_reply (-1, FILEIO_ENOSYS);
-        break;
-      case RETURN_QUIT:
-        remote_fileio_reply (-1, FILEIO_EINTR);
-       break;
-      default:
-        break;
+      /* If the target hasn't responded to the Ctrl-C sent
+        asynchronously earlier, take this opportunity to send the
+        Ctrl-C synchronously.  */
+      remote_fio_ctrl_c_flag = 1;
+      remote_fio_no_longjmp = 0;
+      remote_fileio_reply (-1, FILEIO_EINTR);
+    }
+  else
+    {
+      remote_fio_ctrl_c_flag = 0;
+      remote_fio_no_longjmp = 0;
+
+      ex = catch_exceptions (uiout, do_remote_fileio_request, (void *)buf,
+                            RETURN_MASK_ALL);
+      switch (ex)
+       {
+       case RETURN_ERROR:
+         remote_fileio_reply (-1, FILEIO_ENOSYS);
+         break;
+       case RETURN_QUIT:
+         remote_fileio_reply (-1, FILEIO_EINTR);
+         break;
+       default:
+         break;
+       }
     }
 
   remote_fileio_sig_exit ();
index 7266e1d..82fd9c9 100644 (file)
@@ -26,7 +26,7 @@ struct cmd_list_element;
 
 /* Unified interface to remote fileio, called in remote.c from
    remote_wait () and remote_async_wait () */
-extern void remote_fileio_request (char *buf);
+extern void remote_fileio_request (char *buf, int ctrlc_pending_p);
 
 /* Cleanup any remote fileio state.  */
 extern void remote_fileio_reset (void);
index 664a9c7..9fa92fb 100644 (file)
@@ -297,6 +297,10 @@ struct remote_state
 
   /* True if the stub reports support for conditional tracepoints.  */
   int cond_tracepoints;
+
+  /* Nonzero if the user has pressed Ctrl-C, but the target hasn't
+     responded to that.  */
+  int ctrlc_pending_p;
 };
 
 /* Returns true if the multi-process extensions are in effect.  */
@@ -3394,6 +3398,7 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target, int extended
   rs->extended = extended_p;
   rs->non_stop_aware = 0;
   rs->waiting_for_stop_reply = 0;
+  rs->ctrlc_pending_p = 0;
 
   general_thread = not_sent_ptid;
   continue_thread = not_sent_ptid;
@@ -4122,6 +4127,8 @@ remote_stop_as (ptid_t ptid)
 {
   struct remote_state *rs = get_remote_state ();
 
+  rs->ctrlc_pending_p = 1;
+
   /* If the inferior is stopped already, but the core didn't know
      about it yet, just ignore the request.  The cached wait status
      will be collected in remote_wait.  */
@@ -4848,6 +4855,11 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
   /* We got something.  */
   rs->waiting_for_stop_reply = 0;
 
+  /* Assume that the target has acknowledged Ctrl-C unless we receive
+     an 'F' or 'O' packet.  */
+  if (buf[0] != 'F' && buf[0] != 'O')
+    rs->ctrlc_pending_p = 0;
+
   switch (buf[0])
     {
     case 'E':          /* Error of some sort.  */
@@ -4858,7 +4870,8 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
       status->value.sig = TARGET_SIGNAL_0;
       break;
     case 'F':          /* File-I/O request.  */
-      remote_fileio_request (buf);
+      remote_fileio_request (buf, rs->ctrlc_pending_p);
+      rs->ctrlc_pending_p = 0;
       break;
     case 'T': case 'S': case 'X': case 'W':
       {