This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
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;