This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Decouple target_interrupt from all-stop/non-stop modes


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e42de8c7f8e7326d284f8b53f3bd6971fbf6e7b7

commit e42de8c7f8e7326d284f8b53f3bd6971fbf6e7b7
Author: Pedro Alves <palves@redhat.com>
Date:   Tue Apr 12 16:49:31 2016 +0100

    Decouple target_interrupt from all-stop/non-stop modes
    
    In non-stop mode, "interrupt" results in a "stop with no signal",
    while in all-stop mode, it results in a remote interrupt request /
    stop with SIGINT.  This is currently implemented in both the Linux and
    remote target backends.  Move it to the core code instead, making
    target_interrupt specifically always about "Interrupting as if with
    Ctrl-C", just like it is documented.
    
    gdb/ChangeLog:
    2016-04-12  Pedro Alves  <palves@redhat.com>
    
    	* infcmd.c (interrupt_target_1): Call target_stop is in non-stop
    	mode.
    	* linux-nat.c (linux_nat_interrupt): Delete.
    	(linux_nat_add_target): Don't install linux_nat_interrupt.
    	* remote.c (remote_interrupt_ns): Change return type to void.
    	Throw error if interrupting the target is not supported.
    	(remote_interrupt): Don't call the remote_stop_ns/remote_stop_as.

Diff:
---
 gdb/ChangeLog   | 10 ++++++++++
 gdb/infcmd.c    |  6 +++++-
 gdb/linux-nat.c | 10 ----------
 gdb/remote.c    | 35 +++++++++--------------------------
 4 files changed, 24 insertions(+), 37 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 7f0df5f..2a05df2 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,15 @@
 2016-04-12  Pedro Alves  <palves@redhat.com>
 
+	* infcmd.c (interrupt_target_1): Call target_stop is in non-stop
+	mode.
+	* linux-nat.c (linux_nat_interrupt): Delete.
+	(linux_nat_add_target): Don't install linux_nat_interrupt.
+	* remote.c (remote_interrupt_ns): Change return type to void.
+	Throw error if interrupting the target is not supported.
+	(remote_interrupt): Don't call the remote_stop_ns/remote_stop_as.
+
+2016-04-12  Pedro Alves  <palves@redhat.com>
+
 	* defs.h (clear_quit_flag): Remove declaration.
 	* extension-priv.h (struct extension_language_ops)
 	<clear_quit_flag>: Remove field and update comments.
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index d687116..3a0265f 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -3013,7 +3013,11 @@ interrupt_target_1 (int all_threads)
     ptid = minus_one_ptid;
   else
     ptid = inferior_ptid;
-  target_interrupt (ptid);
+
+  if (non_stop)
+    target_stop (ptid);
+  else
+    target_interrupt (ptid);
 
   /* Tag the thread as having been explicitly requested to stop, so
      other parts of gdb know not to resume this thread automatically,
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 0829bcb..b75153c 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -4463,15 +4463,6 @@ linux_nat_stop (struct target_ops *self, ptid_t ptid)
 }
 
 static void
-linux_nat_interrupt (struct target_ops *self, ptid_t ptid)
-{
-  if (non_stop)
-    iterate_over_lwps (ptid, linux_nat_stop_lwp, NULL);
-  else
-    linux_ops->to_interrupt (linux_ops, ptid);
-}
-
-static void
 linux_nat_close (struct target_ops *self)
 {
   /* Unregister from the event loop.  */
@@ -4672,7 +4663,6 @@ linux_nat_add_target (struct target_ops *t)
   t->to_close = linux_nat_close;
 
   t->to_stop = linux_nat_stop;
-  t->to_interrupt = linux_nat_interrupt;
 
   t->to_supports_multi_process = linux_nat_supports_multi_process;
 
diff --git a/gdb/remote.c b/gdb/remote.c
index 443beac..1bd2bcf 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -5813,10 +5813,10 @@ remote_interrupt_as (void)
 
 /* Non-stop version of target_interrupt.  Uses `vCtrlC' to interrupt
    the remote target.  It is undefined which thread of which process
-   reports the interrupt.  Returns true if the packet is supported by
-   the server, false otherwise.  */
+   reports the interrupt.  Throws an error if the packet is not
+   supported by the server.  */
 
-static int
+static void
 remote_interrupt_ns (void)
 {
   struct remote_state *rs = get_remote_state ();
@@ -5835,12 +5835,10 @@ remote_interrupt_ns (void)
     case PACKET_OK:
       break;
     case PACKET_UNKNOWN:
-      return 0;
+      error (_("No support for interrupting the remote target."));
     case PACKET_ERROR:
       error (_("Interrupting target failed: %s"), rs->buf);
     }
-
-  return 1;
 }
 
 /* Implement the to_stop function for the remote targets.  */
@@ -5866,30 +5864,15 @@ remote_stop (struct target_ops *self, ptid_t ptid)
 static void
 remote_interrupt (struct target_ops *self, ptid_t ptid)
 {
+  struct remote_state *rs = get_remote_state ();
+
   if (remote_debug)
     fprintf_unfiltered (gdb_stdlog, "remote_interrupt called\n");
 
-  if (non_stop)
-    {
-      /* In non-stop mode, we always stop with no signal instead.  */
-      remote_stop_ns (ptid);
-    }
+  if (target_is_non_stop_p ())
+    remote_interrupt_ns ();
   else
-    {
-      /* In all-stop, we emulate ^C-ing the remote target's
-	 terminal.  */
-      if (target_is_non_stop_p ())
-	{
-	  if (!remote_interrupt_ns ())
-	    {
-	      /* No support for ^C-ing the remote target.  Stop it
-		 (with no signal) instead.  */
-	      remote_stop_ns (ptid);
-	    }
-	}
-      else
-	remote_interrupt_as ();
-    }
+    remote_interrupt_as ();
 }
 
 /* Ask the user what to do when an interrupt is received.  */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]