* linux-nat.c (linux_nat_terminal_inferior)
authorPedro Alves <palves@redhat.com>
Thu, 21 May 2009 16:00:14 +0000 (16:00 +0000)
committerPedro Alves <palves@redhat.com>
Thu, 21 May 2009 16:00:14 +0000 (16:00 +0000)
(linux_nat_terminal_ours): Don't check sync_execution.
* remote.c (remote_terminal_inferior, remote_terminal_ours):
Don't check sync_execution.  Update comments.
* target.c (target_terminal_inferior): New.
* target.h (target_terminal_inferior): Delete macro, and declare
as function.
* event-top.c (async_disable_stdin): Make idempotent.  Don't give
the target the terminal here.
* inflow.c (terminal_ours_1): Don't return early without setting
`terminal_is_ours'.

gdb/ChangeLog
gdb/event-top.c
gdb/inflow.c
gdb/linux-nat.c
gdb/remote.c
gdb/target.c
gdb/target.h

index c45f8aaebbcf85d2293e04a2014afacb72f1d497..56223059fd3c21c876dd7b393fd12ac8990c5b21 100644 (file)
@@ -1,3 +1,17 @@
+2009-05-21  Pedro Alves  <pedro@codesourcery.com>
+
+       * linux-nat.c (linux_nat_terminal_inferior)
+       (linux_nat_terminal_ours): Don't check sync_execution.
+       * remote.c (remote_terminal_inferior, remote_terminal_ours):
+       Don't check sync_execution.  Update comments.
+       * target.c (target_terminal_inferior): New.
+       * target.h (target_terminal_inferior): Delete macro, and declare
+       as function.
+       * event-top.c (async_disable_stdin): Make idempotent.  Don't give
+       the target the terminal here.
+       * inflow.c (terminal_ours_1): Don't return early without setting
+       `terminal_is_ours'.
+
 2009-05-21  Pedro Alves  <pedro@codesourcery.com>
 
        * target.h (TARGET_WNOHANG): New.
index fd7c521a5ea9d5706aa4a97bd76619ea7e2a9d52..31ebd4ea0042d87a3181267a4f4511c755de8c08 100644 (file)
@@ -458,14 +458,11 @@ async_enable_stdin (void)
 void
 async_disable_stdin (void)
 {
-  sync_execution = 1;
-  push_prompt ("", "", "");
-  /* FIXME: cagney/1999-09-27: At present this call is technically
-     redundant since infcmd.c and infrun.c both already call
-     target_terminal_inferior().  As the terminal handling (in
-     sync/async mode) is refined, the duplicate calls can be
-     eliminated (Here or in infcmd.c/infrun.c). */
-  target_terminal_inferior ();
+  if (!sync_execution)
+    {
+      sync_execution = 1;
+      push_prompt ("", "", "");
+    }
 }
 \f
 
index 6ca5bd8cc4a05d179fef87f3eb9ecb75cc739501..27995cc0f87acae7891a1721de3be303f8614b9b 100644 (file)
@@ -361,6 +361,8 @@ terminal_ours_1 (int output_only)
   if (terminal_is_ours)
     return;
 
+  terminal_is_ours = 1;
+
   /* Checking inferior->run_terminal is necessary so that
      if GDB is running in the background, it won't block trying
      to do the ioctl()'s below.  Checking gdb_has_a_terminal
@@ -371,7 +373,6 @@ terminal_ours_1 (int output_only)
   if (inf->terminal_info->run_terminal != NULL || gdb_has_a_terminal () == 0)
     return;
 
-  if (!terminal_is_ours)
     {
 #ifdef SIGTTOU
       /* Ignore this signal since it will happen when we try to set the
@@ -380,8 +381,6 @@ terminal_ours_1 (int output_only)
 #endif
       int result;
 
-      terminal_is_ours = 1;
-
 #ifdef SIGTTOU
       if (job_control)
        osigttou = (void (*)()) signal (SIGTTOU, SIG_IGN);
index 8f12587950092623a9cb7c915633a6914a20dd94..90574424a32c42c686ccb38201563cd329946ac6 100644 (file)
@@ -4360,14 +4360,9 @@ linux_nat_terminal_inferior (void)
       return;
     }
 
-  /* GDB should never give the terminal to the inferior, if the
-     inferior is running in the background (run&, continue&, etc.).
-     This check can be removed when the common code is fixed.  */
-  if (!sync_execution)
-    return;
-
   terminal_inferior ();
 
+  /* Calls to target_terminal_*() are meant to be idempotent.  */
   if (!async_terminal_is_ours)
     return;
 
@@ -4393,9 +4388,6 @@ linux_nat_terminal_ours (void)
      but claiming it sure should.  */
   terminal_ours ();
 
-  if (!sync_execution)
-    return;
-
   if (async_terminal_is_ours)
     return;
 
index 199120d553dc27f19e6bf4920d35a7038e792503..8a1a0d4c141c09a683b4c3014643361820394fb5 100644 (file)
@@ -4078,19 +4078,12 @@ remote_terminal_inferior (void)
     /* Nothing to do.  */
     return;
 
-  /* FIXME: cagney/1999-09-27: Shouldn't need to test for
-     sync_execution here.  This function should only be called when
-     GDB is resuming the inferior in the forground.  A background
-     resume (``run&'') should leave GDB in control of the terminal and
-     consequently should not call this code.  */
-  if (!sync_execution)
-    return;
-  /* FIXME: cagney/1999-09-27: Closely related to the above.  Make
-     calls target_terminal_*() idenpotent. The event-loop GDB talking
-     to an asynchronous target with a synchronous command calls this
-     function from both event-top.c and infrun.c/infcmd.c.  Once GDB
-     stops trying to transfer the terminal to the target when it
-     shouldn't this guard can go away.  */
+  /* FIXME: cagney/1999-09-27: Make calls to target_terminal_*()
+     idempotent.  The event-loop GDB talking to an asynchronous target
+     with a synchronous command calls this function from both
+     event-top.c and infrun.c/infcmd.c.  Once GDB stops trying to
+     transfer the terminal to the target when it shouldn't this guard
+     can go away.  */
   if (!remote_async_terminal_ours_p)
     return;
   delete_file_handler (input_fd);
@@ -4109,9 +4102,6 @@ remote_terminal_ours (void)
     return;
 
   /* See FIXME in remote_terminal_inferior.  */
-  if (!sync_execution)
-    return;
-  /* See FIXME in remote_terminal_inferior.  */
   if (remote_async_terminal_ours_p)
     return;
   cleanup_sigint_signal_handler (NULL);
index 8cbde1b91ec673d23a6dc995426e6a9dccbfa343..6dfa73667dada32e3728837d0bd9cb687508105c 100644 (file)
@@ -301,6 +301,18 @@ target_create_inferior (char *exec_file, char *args,
                  "could not find a target to create inferior");
 }
 
+void
+target_terminal_inferior (void)
+{
+  /* A background resume (``run&'') should leave GDB in control of the
+     terminal.  */
+  if (target_is_async_p () && !sync_execution)
+    return;
+
+  /* If GDB is resuming the inferior in the foreground, install
+     inferior's terminal modes.  */
+  (*current_target.to_terminal_inferior) ();
+}
 
 static int
 nomemory (CORE_ADDR memaddr, char *myaddr, int len, int write,
index 5ec06a08e6f17b53d54b14bed62d48105b6dfaf5..b1fe4032aaeb26a565b6ab16bae4666b9a7392b3 100644 (file)
@@ -763,8 +763,7 @@ extern void print_section_info (struct target_ops *, bfd *);
 /* Put the inferior's terminal settings into effect.
    This is preparation for starting or resuming the inferior.  */
 
-#define target_terminal_inferior() \
-     (*current_target.to_terminal_inferior) ()
+extern void target_terminal_inferior (void);
 
 /* Put some of our terminal settings into effect,
    enough to get proper results from our output,