gdb
[deliverable/binutils-gdb.git] / gdb / top.c
index 593da2d22939e7aecd382fa6545aa57548604ca4..3aff25f98b9d653f2bf3f3bc60ac7408314bfb18 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -2,7 +2,7 @@
 
    Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
    1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-   2008 Free Software Foundation, Inc.
+   2008, 2009 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -132,9 +132,6 @@ void (*window_hook) (FILE *, char *);
 int epoch_interface;
 int xgdb_verbose;
 
-/* gdb prints this when reading a command interactively */
-static char *gdb_prompt_string;        /* the global prompt string */
-
 /* Buffer used for reading command lines, and the size
    allocated for it so far.  */
 
@@ -286,11 +283,6 @@ void (*deprecated_set_hook) (struct cmd_list_element * c);
 
 void (*deprecated_context_hook) (int id);
 
-/* Takes control from error ().  Typically used to prevent longjmps out of the
-   middle of the GUI.  Usually used in conjunction with a catch routine.  */
-
-void (*deprecated_error_hook) (void);
-
 /* Handler for SIGHUP.  */
 
 #ifdef SIGHUP
@@ -408,14 +400,6 @@ execute_command (char *p, int from_tty)
 
       c = lookup_cmd (&p, cmdlist, "", 0, 1);
 
-      /* If the selected thread has terminated, we allow only a
-        limited set of commands.  */
-      if (target_can_async_p ()
-         && is_exited (inferior_ptid)
-         && !get_cmd_no_selected_thread_ok (c))
-       error (_("\
-Cannot execute this command without a live selected thread.  See `help thread'."));
-
       /* Pass null arg rather than an empty one.  */
       arg = *p ? p : 0;
 
@@ -477,7 +461,7 @@ Cannot execute this command without a live selected thread.  See `help thread'."
   /* FIXME:  This should be cacheing the frame and only running when
      the frame changes.  */
 
-  if (target_has_stack && is_stopped (inferior_ptid))
+  if (has_stack_frames ())
     {
       flang = get_frame_language ();
       if (!warned
@@ -1122,7 +1106,7 @@ print_gdb_version (struct ui_file *stream)
 
   /* Second line is a copyright notice. */
 
-  fprintf_filtered (stream, "Copyright (C) 2008 Free Software Foundation, Inc.\n");
+  fprintf_filtered (stream, "Copyright (C) 2009 Free Software Foundation, Inc.\n");
 
   /* Following the copyright is a brief statement that the program is
      free software, that users are free to copy and change it on
@@ -1185,16 +1169,17 @@ quit_confirm (void)
   if (! ptid_equal (inferior_ptid, null_ptid) && target_has_execution)
     {
       char *s;
+      struct inferior *inf = current_inferior ();
 
       /* This is something of a hack.  But there's no reliable way to
          see if a GUI is running.  The `use_windows' variable doesn't
          cut it.  */
       if (deprecated_init_ui_hook)
-       s = "A debugging session is active.\nDo you still want to close the debugger?";
-      else if (attach_flag)
-       s = "The program is running.  Quit anyway (and detach it)? ";
+       s = _("A debugging session is active.\nDo you still want to close the debugger?");
+      else if (inf->attach_flag)
+       s = _("The program is running.  Quit anyway (and detach it)? ");
       else
-       s = "The program is running.  Quit anyway (and kill it)? ";
+       s = _("The program is running.  Quit anyway (and kill it)? ");
 
       if (!query ("%s", s))
        return 0;
@@ -1203,27 +1188,59 @@ quit_confirm (void)
   return 1;
 }
 
-/* Helper routine for quit_force that requires error handling.  */
-
 struct qt_args
 {
   char *args;
   int from_tty;
 };
 
+/* Callback for iterate_over_threads.  Finds any thread of inferior
+   given by ARG (really an int*).  */
+
 static int
-quit_target (void *arg)
+any_thread_of (struct thread_info *thread, void *arg)
 {
-  struct qt_args *qt = (struct qt_args *)arg;
+  int pid = * (int *)arg;
 
-  if (! ptid_equal (inferior_ptid, null_ptid) && target_has_execution)
+  if (PIDGET (thread->ptid) == pid)
+    return 1;
+
+  return 0;
+}
+
+/* Callback for iterate_over_inferiors.  Kills or detaches the given
+   inferior, depending on how we originally gained control of it.  */
+
+static int
+kill_or_detach (struct inferior *inf, void *args)
+{
+  struct qt_args *qt = args;
+  struct thread_info *thread;
+
+  thread = iterate_over_threads (any_thread_of, &inf->pid);
+  if (thread)
     {
-      if (attach_flag)
-        target_detach (qt->args, qt->from_tty);
+      switch_to_thread (thread->ptid);
+      if (inf->attach_flag)
+       target_detach (qt->args, qt->from_tty);
       else
-        target_kill ();
+       target_kill ();
     }
 
+  return 0;
+}
+
+/* Helper routine for quit_force that requires error handling.  */
+
+static int
+quit_target (void *arg)
+{
+  struct qt_args *qt = (struct qt_args *)arg;
+
+  /* Kill or detach all inferiors.  */
+  if (target_has_execution)
+    iterate_over_inferiors (kill_or_detach, qt);
+
   /* Give all pushed targets a chance to do minimal cleanup, and pop
      them all out.  */
   pop_all_targets (1);
@@ -1518,6 +1535,7 @@ init_main (void)
   write_history_p = 0;
 
   /* Setup important stuff for command line editing.  */
+  rl_completion_word_break_hook = gdb_completion_word_break_characters;
   rl_completion_entry_function = readline_line_completion_function;
   rl_completer_word_break_characters = default_word_break_characters ();
   rl_completer_quote_characters = get_gdb_completer_quote_characters ();
@@ -1611,9 +1629,6 @@ gdb_init (char *argv0)
 
   /* Run the init function of each source file */
 
-  getcwd (gdb_dirbuf, sizeof (gdb_dirbuf));
-  current_directory = gdb_dirbuf;
-
 #ifdef __MSDOS__
   /* Make sure we return to the original directory upon exit, come
      what may, since the OS doesn't do that for us.  */
This page took 0.025786 seconds and 4 git commands to generate.