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]

Re: [PATCH] Don't call Insight hooks when not appropriate


On Wed, Mar 29, 2006 at 05:36:19PM +0100, Andrew STUBBS wrote:
> I have now tested your full patch. I could not get it to compile without 
> adding 'caution' to top.h and including top.h in utils.c.
> 
> With that one change it does what I want. Thanks.
> 
> One small query: defaulted_query() used to return def_value, but now 
> always returns 1. This does not seem to be the same thing. The new text 
> is identical to that in query(), which smells like a paste-o to me.

Thank you for testing.  I've made those changes, tested GDB, and
checked it in - you're right about the paste-o, I had it right the
first time I did that and then I edited the comment and busted it...

Here's the final patch.

-- 
Daniel Jacobowitz
CodeSourcery

2006-03-29  Daniel Jacobowitz  <dan@codesourcery.com>

	* Makefile.in (utils.o): Update.
	* top.c (in_user_command): New.
	(command_line_input): Use input_from_terminal_p.
	(input_from_terminal_p): Don't check caution.  Handle
	stdin == NULL for Insight.
	* top.h (in_user_command, caution): New declarations.
	* utils.c: Include "top.h".
	(query, defaulted_query): Check caution here.  Move the call
	to input_from_terminal_p higher.
	* cli/cli-script.c (do_restore_user_call_depth): Only decrement
	the depth.  Update in_user_command if necessary.
	(execute_user_command): Don't clobber old_chain.  Set
	in_user_command.  Let do_restore_user_call_depth handle
	user_call_depth.
	(read_command_lines): Check whether to prompt before calling
	Insight hooks.
	* tui/tui-hooks.c (tui_query_hook): Remove newly unnecessary
	input_from_terminal_p check.

Index: gdb/Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.796
diff -u -p -r1.796 Makefile.in
--- gdb/Makefile.in	28 Mar 2006 19:19:16 -0000	1.796
+++ gdb/Makefile.in	29 Mar 2006 22:52:04 -0000
@@ -2744,7 +2744,7 @@ user-regs.o: user-regs.c $(defs_h) $(use
 utils.o: utils.c $(defs_h) $(gdb_assert_h) $(gdb_string_h) $(event_top_h) \
 	$(exceptions_h) $(tui_h) $(gdbcmd_h) $(serial_h) $(bfd_h) \
 	$(target_h) $(demangle_h) $(expression_h) $(language_h) $(charset_h) \
-	$(annotate_h) $(filenames_h) $(symfile_h) $(inferior_h) \
+	$(annotate_h) $(filenames_h) $(symfile_h) $(inferior_h) $(top_h) \
 	$(gdb_curses_h) $(readline_h) $(gdb_obstack_h)
 uw-thread.o: uw-thread.c $(defs_h) $(gdbthread_h) $(target_h) $(inferior_h) \
 	$(regcache_h) $(gregset_h)
Index: gdb/top.c
===================================================================
RCS file: /cvs/src/src/gdb/top.c,v
retrieving revision 1.113
diff -u -p -r1.113 top.c
--- gdb/top.c	10 Feb 2006 22:01:43 -0000	1.113
+++ gdb/top.c	29 Mar 2006 22:52:04 -0000
@@ -112,6 +112,10 @@ Whether to confirm potentially dangerous
 
 FILE *instream;
 
+/* Flag to indicate whether a user defined command is currently running.  */
+
+int in_user_command;
+
 /* Current working directory.  */
 
 char *current_directory;
@@ -909,11 +913,11 @@ command_line_input (char *prompt_arg, in
 	}
 
       /* Don't use fancy stuff if not talking to stdin.  */
-      if (deprecated_readline_hook && instream == NULL)
+      if (deprecated_readline_hook && input_from_terminal_p ())
 	{
 	  rl = (*deprecated_readline_hook) (local_prompt);
 	}
-      else if (command_editing_p && instream == stdin && ISATTY (instream))
+      else if (command_editing_p && input_from_terminal_p ())
 	{
 	  rl = gdb_readline_wrapper (local_prompt);
 	}
@@ -1197,13 +1201,22 @@ quit_force (char *args, int from_tty)
   exit (exit_code);
 }
 
-/* Returns whether GDB is running on a terminal and whether the user
-   desires that questions be asked of them on that terminal.  */
+/* Returns whether GDB is running on a terminal and input is
+   currently coming from that terminal.  */
 
 int
 input_from_terminal_p (void)
 {
-  return gdb_has_a_terminal () && (instream == stdin) & caution;
+  if (gdb_has_a_terminal () && instream == stdin)
+    return 1;
+
+  /* If INSTREAM is unset, and we are not in a user command, we
+     must be in Insight.  That's like having a terminal, for our
+     purposes.  */
+  if (instream == NULL && !in_user_command)
+    return 1;
+
+  return 0;
 }
 
 static void
Index: gdb/top.h
===================================================================
RCS file: /cvs/src/src/gdb/top.h,v
retrieving revision 1.12
diff -u -p -r1.12 top.h
--- gdb/top.h	17 Dec 2005 22:34:03 -0000	1.12
+++ gdb/top.h	29 Mar 2006 22:52:04 -0000
@@ -1,7 +1,7 @@
 /* Top level stuff for GDB, the GNU debugger.
 
    Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
-   1996, 1997, 1998, 1999, 2000, 2005 Free Software Foundation, Inc.
+   1996, 1997, 1998, 1999, 2000, 2005, 2006 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -27,6 +27,8 @@
 extern char *line;
 extern int linesize;
 extern FILE *instream;
+extern int in_user_command;
+extern int caution;
 extern char gdb_dirbuf[1024];
 extern int inhibit_gdbinit;
 extern int epoch_interface;
Index: gdb/utils.c
===================================================================
RCS file: /cvs/src/src/gdb/utils.c,v
retrieving revision 1.166
diff -u -p -r1.166 utils.c
--- gdb/utils.c	10 Feb 2006 21:53:51 -0000	1.166
+++ gdb/utils.c	29 Mar 2006 22:52:04 -0000
@@ -54,6 +54,7 @@
 #include "filenames.h"
 #include "symfile.h"
 #include "gdb_obstack.h"
+#include "top.h"
 
 #include "inferior.h"		/* for signed_pointer_to_address */
 
@@ -1141,16 +1142,17 @@ query (const char *ctlstr, ...)
   int ans2;
   int retval;
 
+  /* Automatically answer "yes" if input is not from the user
+     directly, or if the user did not want prompts.  */
+  if (!input_from_terminal_p () || !caution)
+    return 1;
+
   if (deprecated_query_hook)
     {
       va_start (args, ctlstr);
       return deprecated_query_hook (ctlstr, args);
     }
 
-  /* Automatically answer "yes" if input is not from a terminal.  */
-  if (!input_from_terminal_p ())
-    return 1;
-
   while (1)
     {
       wrap_here ("");		/* Flush any buffered output */
@@ -1244,15 +1246,16 @@ defaulted_query (const char *ctlstr, con
       n_string = "[n]";
     }
 
+  /* Automatically answer the default value if input is not from the user
+     directly, or if the user did not want prompts.  */
+  if (!input_from_terminal_p () || !caution)
+    return def_value;
+
   if (deprecated_query_hook)
     {
       return deprecated_query_hook (ctlstr, args);
     }
 
-  /* Automatically answer default value if input is not from a terminal.  */
-  if (!input_from_terminal_p ())
-    return def_value;
-
   while (1)
     {
       wrap_here ("");		/* Flush any buffered output */
Index: gdb/cli/cli-script.c
===================================================================
RCS file: /cvs/src/src/gdb/cli/cli-script.c,v
retrieving revision 1.32
diff -u -p -r1.32 cli-script.c
--- gdb/cli/cli-script.c	17 Dec 2005 22:40:17 -0000	1.32
+++ gdb/cli/cli-script.c	29 Mar 2006 22:52:05 -0000
@@ -1,8 +1,8 @@
 /* GDB CLI command scripting.
 
    Copyright (c) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
-   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005 Free
-   Software Foundation, Inc.
+   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -241,9 +241,9 @@ static void
 do_restore_user_call_depth (void * call_depth)
 {	
   int * depth = call_depth;
-  /* We will be returning_to_top_level() at this point, so we want to
-     reset our depth. */
-  (*depth) = 0;
+  (*depth)--;
+  if ((*depth) == 0)
+    in_user_command = 0;
 }
 
 
@@ -266,12 +266,17 @@ execute_user_command (struct cmd_list_el
   if (++user_call_depth > max_user_call_depth)
     error (_("Max user call depth exceeded -- command aborted."));
 
-  old_chain = make_cleanup (do_restore_user_call_depth, &user_call_depth);
+  make_cleanup (do_restore_user_call_depth, &user_call_depth);
 
   /* Set the instream to 0, indicating execution of a
      user-defined function.  */
-  old_chain = make_cleanup (do_restore_instream_cleanup, instream);
+  make_cleanup (do_restore_instream_cleanup, instream);
   instream = (FILE *) 0;
+
+  /* Also set the global in_user_command, so that NULL instream is
+     not confused with Insight.  */
+  in_user_command = 1;
+
   while (cmdlines)
     {
       ret = execute_control_command (cmdlines);
@@ -283,8 +288,6 @@ execute_user_command (struct cmd_list_el
       cmdlines = cmdlines->next;
     }
   do_cleanups (old_chain);
-
-  user_call_depth--;
 }
 
 enum command_control_type
@@ -920,15 +923,19 @@ read_command_lines (char *prompt_arg, in
   enum misc_command_type val;
 
   control_level = 0;
-  if (deprecated_readline_begin_hook)
-    {
-      /* Note - intentional to merge messages with no newline */
-      (*deprecated_readline_begin_hook) ("%s  %s\n", prompt_arg, END_MESSAGE);
-    }
-  else if (from_tty && input_from_terminal_p ())
+
+  if (from_tty && input_from_terminal_p ())
     {
-      printf_unfiltered ("%s\n%s\n", prompt_arg, END_MESSAGE);
-      gdb_flush (gdb_stdout);
+      if (deprecated_readline_begin_hook)
+	{
+	  /* Note - intentional to merge messages with no newline */
+	  (*deprecated_readline_begin_hook) ("%s  %s\n", prompt_arg, END_MESSAGE);
+	}
+      else
+	{
+	  printf_unfiltered ("%s\n%s\n", prompt_arg, END_MESSAGE);
+	  gdb_flush (gdb_stdout);
+	}
     }
 
   head = tail = NULL;
@@ -989,7 +996,7 @@ read_command_lines (char *prompt_arg, in
 	do_cleanups (old_chain);
     }
 
-  if (deprecated_readline_end_hook)
+  if (deprecated_readline_end_hook && from_tty && input_from_terminal_p ())
     {
       (*deprecated_readline_end_hook) ();
     }
Index: gdb/tui/tui-hooks.c
===================================================================
RCS file: /cvs/src/src/gdb/tui/tui-hooks.c,v
retrieving revision 1.26
diff -u -p -r1.26 tui-hooks.c
--- gdb/tui/tui-hooks.c	23 Dec 2005 19:10:02 -0000	1.26
+++ gdb/tui/tui-hooks.c	29 Mar 2006 22:52:05 -0000
@@ -1,6 +1,7 @@
 /* GDB hooks for TUI.
 
-   Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -77,10 +78,6 @@ tui_query_hook (const char * msg, va_lis
   int ans2;
   int answer;
 
-  /* Automatically answer "yes" if input is not from a terminal.  */
-  if (!input_from_terminal_p ())
-    return 1;
-
   echo ();
   while (1)
     {


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