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: TUI + gdbserver broken?


On Thu, Mar 22, 2007 at 02:51:00AM +0000, Pedro Alves wrote:
> I've been trying to understand why doing as you suggested doesn't
> work, and what I see makes me believe that the current frame hook
> handling is not safe - that is, as I said before, I believe that
> calling:
> get_selected_frame -> select_frame ->
> deprecated_selected_frame_level_changed_hook
> inside a deprecated_selected_frame_level_changed_hook is a bad
> idea.  I believe those hooks should be pure observers.

The problem, really, is that these are silly places for hooks when
GDB's internal state is inconsistent.

The registers_changed hook is getting you in trouble because it is
called when we invalidate registers - having it immediately fetch new
registers is very bad!  See the comment in infrun.c right before this
call to registers_changed for more.

Fortunately TUI's registers_changed hook hasn't done anything in a long
time.  Insight doesn't even use it.  We can delete it.

Could you see if the attached works for you?

-- 
Daniel Jacobowitz
CodeSourcery

2007-03-27  Daniel Jacobowitz  <dan@codesourcery.com>

	* defs.h (deprecated_registers_changed_hook): Delete declaration.
	* interps.c (clear_interpreter_hooks): Do not clear
	deprecated_registers_changed_hook.
	* regcache.c (registers_changed): Do not call it.
	* top.c (deprecated_registers_changed_hook): Do not define it.
	* mi/mi-interp.c (mi_command_loop): Do not clear it.
	* tui/tui-hooks.c (tui_install_hooks): Do not install it.
	(tui_remove_hooks): Do not remove it.
	(tui_selected_frame_level_changed_hook): Check for negative level.
	Use get_selected_frame.
	(tui_registers_changed_hook): Deleted.

Index: defs.h
===================================================================
RCS file: /cvs/src/src/gdb/defs.h,v
retrieving revision 1.202
diff -u -p -r1.202 defs.h
--- defs.h	8 Feb 2007 16:18:56 -0000	1.202
+++ defs.h	27 Mar 2007 20:12:13 -0000
@@ -1135,7 +1135,6 @@ extern void (*deprecated_create_breakpoi
 extern void (*deprecated_delete_breakpoint_hook) (struct breakpoint * bpt);
 extern void (*deprecated_modify_breakpoint_hook) (struct breakpoint * bpt);
 extern void (*deprecated_interactive_hook) (void);
-extern void (*deprecated_registers_changed_hook) (void);
 extern void (*deprecated_readline_begin_hook) (char *, ...)
      ATTRIBUTE_FPTR_PRINTF_1;
 extern char *(*deprecated_readline_hook) (char *);
Index: interps.c
===================================================================
RCS file: /cvs/src/src/gdb/interps.c,v
retrieving revision 1.19
diff -u -p -r1.19 interps.c
--- interps.c	9 Jan 2007 17:58:51 -0000	1.19
+++ interps.c	27 Mar 2007 20:12:13 -0000
@@ -329,7 +329,6 @@ clear_interpreter_hooks (void)
   deprecated_delete_breakpoint_hook = 0;
   deprecated_modify_breakpoint_hook = 0;
   deprecated_interactive_hook = 0;
-  deprecated_registers_changed_hook = 0;
   deprecated_readline_begin_hook = 0;
   deprecated_readline_hook = 0;
   deprecated_readline_end_hook = 0;
Index: regcache.c
===================================================================
RCS file: /cvs/src/src/gdb/regcache.c,v
retrieving revision 1.142
diff -u -p -r1.142 regcache.c
--- regcache.c	13 Jan 2007 23:24:43 -0000	1.142
+++ regcache.c	27 Mar 2007 20:12:14 -0000
@@ -464,9 +464,6 @@ registers_changed (void)
 
   for (i = 0; i < current_regcache->descr->nr_raw_registers; i++)
     set_register_cached (i, 0);
-
-  if (deprecated_registers_changed_hook)
-    deprecated_registers_changed_hook ();
 }
 
 /* DEPRECATED_REGISTERS_FETCHED ()
Index: top.c
===================================================================
RCS file: /cvs/src/src/gdb/top.c,v
retrieving revision 1.119
diff -u -p -r1.119 top.c
--- top.c	28 Feb 2007 15:55:54 -0000	1.119
+++ top.c	27 Mar 2007 20:12:14 -0000
@@ -271,11 +271,6 @@ void (*deprecated_detach_hook) (void);
 
 void (*deprecated_interactive_hook) (void);
 
-/* Called when the registers have changed, as a hint to a GUI
-   to minimize window update. */
-
-void (*deprecated_registers_changed_hook) (void);
-
 /* Tell the GUI someone changed the register REGNO. -1 means
    that the caller does not know which register changed or
    that several registers have changed (see value_assign). */
Index: mi/mi-interp.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-interp.c,v
retrieving revision 1.18
diff -u -p -r1.18 mi-interp.c
--- mi/mi-interp.c	9 Jan 2007 17:59:08 -0000	1.18
+++ mi/mi-interp.c	27 Mar 2007 20:12:14 -0000
@@ -349,7 +349,6 @@ mi_command_loop (int mi_version)
   deprecated_delete_breakpoint_hook = 0;
   deprecated_modify_breakpoint_hook = 0;
   deprecated_interactive_hook = 0;
-  deprecated_registers_changed_hook = 0;
   deprecated_readline_begin_hook = 0;
   deprecated_readline_hook = 0;
   deprecated_readline_end_hook = 0;
Index: tui/tui-hooks.c
===================================================================
RCS file: /cvs/src/src/gdb/tui/tui-hooks.c,v
retrieving revision 1.30
diff -u -p -r1.30 tui-hooks.c
--- tui/tui-hooks.c	7 Mar 2007 10:29:47 -0000	1.30
+++ tui/tui-hooks.c	27 Mar 2007 20:12:14 -0000
@@ -124,26 +124,10 @@ tui_query_hook (const char * msg, va_lis
   return retval;
 }
 
-/* Prevent recursion of deprecated_registers_changed_hook().  */
+/* Prevent recursion of deprecated_register_changed_hook().  */
 static int tui_refreshing_registers = 0;
 
 static void
-tui_registers_changed_hook (void)
-{
-  struct frame_info *fi;
-
-  fi = get_selected_frame (NULL);
-  if (tui_refreshing_registers == 0)
-    {
-      tui_refreshing_registers = 1;
-#if 0
-      tui_check_data_values (fi);
-#endif
-      tui_refreshing_registers = 0;
-    }
-}
-
-static void
 tui_register_changed_hook (int regno)
 {
   struct frame_info *fi;
@@ -230,7 +214,11 @@ tui_selected_frame_level_changed_hook (i
 {
   struct frame_info *fi;
 
-  fi = deprecated_safe_get_selected_frame ();
+  /* Negative level means that the selected frame was cleared.  */
+  if (level < 0)
+    return;
+
+  fi = get_selected_frame (NULL);
   /* Ensure that symbols for this frame are read in.  Also, determine the
      source language of this frame, and switch to it if desired.  */
   if (fi)
@@ -289,7 +277,6 @@ tui_install_hooks (void)
   /* Install the event hooks.  */
   tui_old_event_hooks = deprecated_set_gdb_event_hooks (&tui_event_hooks);
 
-  deprecated_registers_changed_hook = tui_registers_changed_hook;
   deprecated_register_changed_hook = tui_register_changed_hook;
   deprecated_detach_hook = tui_detach_hook;
 }
@@ -302,7 +289,6 @@ tui_remove_hooks (void)
   deprecated_selected_frame_level_changed_hook = 0;
   deprecated_print_frame_info_listing_hook = 0;
   deprecated_query_hook = 0;
-  deprecated_registers_changed_hook = 0;
   deprecated_register_changed_hook = 0;
   deprecated_detach_hook = 0;
 


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