This is the mail archive of the gdb-patches@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]

attach& support, and attach "async + sync_execution" support.


This patch adds support for attach&, and for synchronous attach in
sync_execution mode.

The linux native async patch I'll post next will support attach&.

-- 
Pedro Alves
2008-03-14  Pedro Alves  <pedro@codesourcery.com>

	* infcmd.c (attach_command_async_continuation): New.
	(attach_command): Support background async execution, and async
	execution in synchronous mode.

---
 gdb/infcmd.c |  122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 112 insertions(+), 10 deletions(-)

Index: src/gdb/infcmd.c
===================================================================
--- src.orig/gdb/infcmd.c	2008-03-14 03:58:34.000000000 +0000
+++ src/gdb/infcmd.c	2008-03-14 03:59:37.000000000 +0000
@@ -1852,6 +1852,63 @@ vector_info (char *args, int from_tty)
 }
 
 
+static void
+attach_command_async_continuation (struct continuation_arg * arg)
+{
+  char *exec_file;
+  char *full_exec_path = NULL;
+
+  char *args;
+  int from_tty;
+
+  args = (char *) arg->data.pointer;
+  from_tty = arg->next->data.integer;
+
+  stop_soon = NO_STOP_QUIETLY;
+
+  /* If no exec file is yet known, try to determine it from the
+     process itself.  */
+  exec_file = (char *) get_exec_file (0);
+  if (!exec_file)
+    {
+      exec_file = target_pid_to_exec_file (PIDGET (inferior_ptid));
+      if (exec_file)
+	{
+	  /* It's possible we don't have a full path, but rather just a
+	     filename.  Some targets, such as HP-UX, don't provide the
+	     full path, sigh.
+
+	     Attempt to qualify the filename against the source path.
+	     (If that fails, we'll just fall back on the original
+	     filename.  Not much more we can do...)
+	   */
+	  if (!source_full_path_of (exec_file, &full_exec_path))
+	    full_exec_path = savestring (exec_file, strlen (exec_file));
+
+	  exec_file_attach (full_exec_path, from_tty);
+	  symbol_file_add_main (full_exec_path, from_tty);
+	}
+    }
+  else
+    {
+      reopen_exec_file ();
+      reread_symbols ();
+    }
+
+  /* Take any necessary post-attaching actions for this platform.  */
+  target_post_attach (PIDGET (inferior_ptid));
+
+  post_create_inferior (&current_target, from_tty);
+
+  /* Install inferior's terminal modes.  */
+  target_terminal_inferior ();
+
+  normal_stop ();
+  async_enable_stdin ();
+  if (deprecated_attach_hook)
+    deprecated_attach_hook ();
+}
+
 /*
  * TODO:
  * Should save/restore the tty state since it might be that the
@@ -1906,6 +1963,24 @@ attach_command (char *args, int from_tty
   */
   clear_solib ();
 
+  if (args)
+    {
+      int async_exec = strip_bg_char (&args);
+
+      /* If we get a request for running in the bg but the target
+         doesn't support it, error out. */
+      if (async_exec && !target_can_async_p ())
+	error (_("Asynchronous execution not supported on this target."));
+
+      /* If we don't get a request of running in the bg, then we need
+         to simulate synchronous (fg) execution.  */
+      if (!async_exec && target_can_async_p ())
+	{
+	  /* Simulate synchronous execution */
+	  async_disable_stdin ();
+	}
+    }
+
   target_attach (args, from_tty);
 
   /* Set up the "saved terminal modes" of the inferior
@@ -1917,17 +1992,39 @@ attach_command (char *args, int from_tty
   init_wait_for_inferior ();
   clear_proceed_status ();
 
-  /* No traps are generated when attaching to inferior under Mach 3
-     or GNU hurd.  */
+  if (target_can_async_p () && !sync_execution)
+    proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
+  else
+    {
+      /* No traps are generated when attaching to inferior under Mach 3
+	 or GNU hurd.  */
 #ifndef ATTACH_NO_WAIT
-  /* Careful here. See comments in inferior.h.  Basically some OSes
-     don't ignore SIGSTOPs on continue requests anymore.  We need a
-     way for handle_inferior_event to reset the stop_signal variable
-     after an attach, and this is what STOP_QUIETLY_NO_SIGSTOP is for.  */
-  stop_soon = STOP_QUIETLY_NO_SIGSTOP;
-  wait_for_inferior (0);
-  stop_soon = NO_STOP_QUIETLY;
+      /* Careful here. See comments in inferior.h.  Basically some OSes
+	 don't ignore SIGSTOPs on continue requests anymore.  We need a
+	 way for handle_inferior_event to reset the stop_signal variable
+	 after an attach, and this is what STOP_QUIETLY_NO_SIGSTOP is for.  */
+      stop_soon = STOP_QUIETLY_NO_SIGSTOP;
+
+      if (target_can_async_p ())
+	{
+	  struct continuation_arg *arg1, *arg2, *arg3;
+
+	  arg1 =
+	    (struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
+	  arg2 =
+	    (struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
+	  arg1->next = arg2;
+	  arg2->next = NULL;
+	  arg1->data.pointer = args;
+	  arg2->data.integer = from_tty;
+	  add_continuation (attach_command_async_continuation, arg1);
+	  return;
+	}
+
+      wait_for_inferior (0);
+      stop_soon = NO_STOP_QUIETLY;
 #endif
+    }
 
   /*
    * If no exec file is yet known, try to determine it from the
@@ -1969,7 +2066,12 @@ attach_command (char *args, int from_tty
   /* Install inferior's terminal modes.  */
   target_terminal_inferior ();
 
-  normal_stop ();
+  if (target_can_async_p ())
+    /* We got here in !sync_execution mode, so there's no stop
+       reason.  */
+    ;
+  else
+    normal_stop ();
 
   if (deprecated_attach_hook)
     deprecated_attach_hook ();

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