20000-05-18 H.J. Lu (hjl@gnu.org)
[binutils-gdb.git] / gdb / event-top.c
index b1b625d8a42fc7cbe6211a99a417b4b719924702..622b70f020d36e22a723645af5dd83a7c6f241d1 100644 (file)
@@ -22,6 +22,7 @@
 #include "defs.h"
 #include "top.h"
 #include "inferior.h"
+#include "target.h"
 #include "terminal.h"          /* for job_control */
 #include "signals.h"
 #include "event-loop.h"
@@ -34,6 +35,8 @@
 #include <readline/readline.h>
 #include <readline/history.h>
 
+#include <signal.h>
+
 /* readline defines this.  */
 #undef savestring
 
@@ -126,17 +129,17 @@ struct prompts the_prompts;
    handlers mark these functions as ready to be executed and the event
    loop, in a later iteration, calls them. See the function
    invoke_async_signal_handler. */
-PTR sigint_token;
+void *sigint_token;
 #ifdef SIGHUP
-PTR sighup_token;
+void *sighup_token;
 #endif
-PTR sigquit_token;
-PTR sigfpe_token;
+void *sigquit_token;
+void *sigfpe_token;
 #if defined(SIGWINCH) && defined(SIGWINCH_HANDLER)
-PTR sigwinch_token;
+void *sigwinch_token;
 #endif
 #ifdef STOP_SIGNAL
-PTR sigtstp_token;
+void *sigtstp_token;
 #endif
 
 /* Structure to save a partially entered command.  This is used when
@@ -243,6 +246,12 @@ display_gdb_prompt (char *new_prompt)
   int prompt_length = 0;
   char *gdb_prompt = get_prompt ();
 
+#ifdef UI_OUT
+  /* When an alternative interpreter has been installed, do not
+     display the comand prompt. */
+  if (interpreter_p)
+    return;
+#endif
 
   if (target_executing && sync_execution)
     {
@@ -399,15 +408,15 @@ pop_prompt (void)
    instead of calling gdb_readline2, give gdb a chance to detect
    errors and do something. */
 void
-stdin_event_handler (int error, int fd, gdb_client_data client_data)
+stdin_event_handler (int error, gdb_client_data client_data)
 {
   if (error)
     {
-      printf_unfiltered ("error detected on stdin, fd %d\n", fd);
-      delete_file_handler (fd);
+      printf_unfiltered ("error detected on stdin\n");
+      delete_file_handler (input_fd);
       discard_all_continuations ();
       /* If stdin died, we may as well kill gdb. */
-      exit (1);
+      quit_command ((char *) 0, stdin == instream);
     }
   else
     (*call_readline) (client_data);
@@ -443,7 +452,10 @@ async_disable_stdin (void)
      sync/async mode) is refined, the duplicate calls can be
      eliminated (Here or in infcmd.c/infrun.c). */
   target_terminal_inferior ();
-  make_exec_cleanup (async_enable_stdin, NULL);
+  /* Add the reinstate of stdin to the list of cleanups to be done
+     in case the target errors out and dies. These cleanups are also
+     done in case of normal successful termination of the execution
+     command, by complete_execution(). */
   make_exec_error_cleanup (async_enable_stdin, NULL);
 }
 \f
@@ -513,8 +525,8 @@ command_handler (char *command)
        (struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
       arg1->next = arg2;
       arg2->next = NULL;
-      arg1->data = (PTR) time_at_cmd_start;
-      arg2->data = (PTR) space_at_cmd_start;
+      arg1->data.integer = time_at_cmd_start;
+      arg2->data.integer = space_at_cmd_start;
       add_continuation (command_line_handler_continuation, arg1);
     }
 
@@ -560,8 +572,8 @@ command_line_handler_continuation (struct continuation_arg *arg)
   extern int display_time;
   extern int display_space;
 
-  long time_at_cmd_start = (long) arg->data;
-  long space_at_cmd_start = (long) arg->next->data;
+  long time_at_cmd_start  = arg->data.longint;
+  long space_at_cmd_start = arg->next->data.longint;
 
   bpstat_do_actions (&stop_bpstat);
   /*do_cleanups (old_chain); *//*?????FIXME????? */
@@ -945,7 +957,7 @@ async_init_signals (void)
 }
 
 void
-mark_async_signal_handler_wrapper (PTR token)
+mark_async_signal_handler_wrapper (void *token)
 {
   mark_async_signal_handler ((struct async_signal_handler *) token);
 }
@@ -1037,7 +1049,15 @@ async_stop_sig (gdb_client_data arg)
   char *prompt = get_prompt ();
 #if STOP_SIGNAL == SIGTSTP
   signal (SIGTSTP, SIG_DFL);
+#if HAVE_SIGPROCMASK
+  {
+    sigset_t zero;
+    sigemptyset (&zero);
+    sigprocmask (SIG_SETMASK, &zero, 0);
+  }
+#else
   sigsetmask (0);
+#endif
   kill (getpid (), SIGTSTP);
   signal (SIGTSTP, handle_stop_sig);
 #else
@@ -1113,9 +1133,25 @@ _initialize_event_loop (void)
 {
   if (event_loop_p)
     {
-      /* When a character is detected on instream by select or poll,
-         readline will be invoked via this callback function. */
-      call_readline = rl_callback_read_char_wrapper;
+      /* If the input stream is connected to a terminal, turn on
+         editing.  */
+      if (ISATTY (instream))
+       {
+         /* Tell gdb that we will be using the readline library. This
+            could be overwritten by a command in .gdbinit like 'set
+            editing on' or 'off'. */
+         async_command_editing_p = 1;
+         
+         /* When a character is detected on instream by select or
+            poll, readline will be invoked via this callback
+            function. */
+         call_readline = rl_callback_read_char_wrapper;
+       }
+      else
+       {
+         async_command_editing_p = 0;
+         call_readline = gdb_readline2;
+       }
 
       /* When readline has read an end-of-line character, it passes
          the complete line to gdb for processing. command_line_handler
@@ -1140,10 +1176,5 @@ _initialize_event_loop (void)
          only when it actually exists (I.e. after we say 'run' or
          after we connect to a remote target. */
       add_file_handler (input_fd, stdin_event_handler, 0);
-
-      /* Tell gdb that we will be using the readline library. This
-         could be overwritten by a command in .gdbinit like 'set
-         editing on' or 'off'. */
-      async_command_editing_p = 1;
     }
 }