* mi/mi-interp.c (mi_interpreter_init): Attach mi_about_to_proceed
	to the about_to_proceed observer notification.
	(mi_about_to_proceed): New.
	(mi_on_resume): Only output ^running and the prompt here if the
	target was proceeded.
	* breakpoint.c (breakpoint_proceeded): New static.
	(breakpoint_about_to_proceed): New.
	(_initialize_breakpoints): Attach breakpoint_about_to_proceed to
	the about_to_proceed observer notification.
	* inferior.h (breakpoint_proceeded): Delete declaration.
	* infrun.c (clear_proceed_status): Don't set breakpoint_proceeded.
	Notify the about_to_proceed observers.
	(struct inferior_status): Delete breakpoint_proceeded member.
	(save_inferior_status): Don't save it.
	(restore_inferior_status): Don't restore it.
	* mi-main.h (mi_proceeded): Declare.
	* mi/mi-main.c (mi_cmd_execute): Clear mi_proceeded before running
	a command.

gdb/doc/

	* observer.texi (about_to_proceed): New.
This commit is contained in:
Pedro Alves 2009-03-22 18:06:07 +00:00
parent c5a4d20bb9
commit f3b1572e1a
9 changed files with 83 additions and 11 deletions

View File

@ -1,3 +1,24 @@
2009-03-22 Pedro Alves <pedro@codesourcery.com>
* mi/mi-interp.c (mi_interpreter_init): Attach mi_about_to_proceed
to the about_to_proceed observer notification.
(mi_about_to_proceed): New.
(mi_on_resume): Only output ^running and the prompt here if the
target was proceeded.
* breakpoint.c (breakpoint_proceeded): New static.
(breakpoint_about_to_proceed): New.
(_initialize_breakpoints): Attach breakpoint_about_to_proceed to
the about_to_proceed observer notification.
* inferior.h (breakpoint_proceeded): Delete declaration.
* infrun.c (clear_proceed_status): Don't set breakpoint_proceeded.
Notify the about_to_proceed observers.
(struct inferior_status): Delete breakpoint_proceeded member.
(save_inferior_status): Don't save it.
(restore_inferior_status): Don't restore it.
* mi-main.h (mi_proceeded): Declare.
* mi/mi-main.c (mi_cmd_execute): Clear mi_proceeded before running
a command.
2009-03-22 Pedro Alves <pedro@codesourcery.com>
* gdbthread.h (struct thread_info): Add in_infcall member.

View File

@ -191,6 +191,11 @@ static int is_hardware_watchpoint (struct breakpoint *bpt);
static void insert_breakpoint_locations (void);
/* Flag indicating that a command has proceeded the inferior past the
current breakpoint. */
static int breakpoint_proceeded;
static const char *
bpdisp_text (enum bpdisp disp)
{
@ -2083,6 +2088,26 @@ bpstat_clear_actions (bpstat bs)
}
}
/* Called when a command is about to proceed the inferior. */
static void
breakpoint_about_to_proceed (void)
{
if (!ptid_equal (inferior_ptid, null_ptid))
{
struct thread_info *tp = inferior_thread ();
/* Allow inferior function calls in breakpoint commands to not
interrupt the command list. When the call finishes
successfully, the inferior will be standing at the same
breakpoint as if nothing happened. */
if (tp->in_infcall)
return;
}
breakpoint_proceeded = 1;
}
/* Stub for cleaning up our state if we error-out of a breakpoint command */
static void
cleanup_executing_breakpoints (void *ignore)
@ -8498,4 +8523,6 @@ inferior in all-stop mode, gdb behaves as if always-inserted mode is off."),
&breakpoint_show_cmdlist);
automatic_hardware_breakpoints = 1;
observer_attach_about_to_proceed (breakpoint_about_to_proceed);
}

View File

@ -1,3 +1,7 @@
2009-03-22 Pedro Alves <pedro@codesourcery.com>
* observer.texi (about_to_proceed): New.
2009-03-21 Jeremy Bennett <jeremy.bennett@embecosm.com>
* gdbint.texinfo (everywhere): Use braces {} in @deftypeXX type

View File

@ -151,6 +151,10 @@ The target was resumed. The @var{ptid} parameter specifies which
thread was resume, and may be RESUME_ALL if all threads are resumed.
@end deftypefun
@deftypefun void about_to_proceed (void)
The target is about to be proceeded.
@end deftypefun
@deftypefun void breakpoint_created (int @var{bpnum})
A new breakpoint has been created. The argument @var{bpnum} is the
number of the newly-created breakpoint.

View File

@ -287,11 +287,6 @@ extern void notice_new_inferior (ptid_t, int, int);
extern CORE_ADDR stop_pc;
/* Flag indicating that a command has proceeded the inferior past the
current breakpoint. */
extern int breakpoint_proceeded;
/* Nonzero if stopped due to completion of a stack dummy routine. */
extern int stop_stack_dummy;

View File

@ -1230,7 +1230,8 @@ clear_proceed_status (void)
}
stop_after_trap = 0;
breakpoint_proceeded = 1; /* We're about to proceed... */
observer_notify_about_to_proceed ();
if (stop_registers)
{
@ -5007,7 +5008,6 @@ struct inferior_status
/* ID if the selected frame when the inferior function call was made. */
struct frame_id selected_frame_id;
int breakpoint_proceeded;
int proceed_to_finish;
int in_infcall;
};
@ -5038,7 +5038,6 @@ save_inferior_status (void)
called. */
inf_status->stop_bpstat = tp->stop_bpstat;
tp->stop_bpstat = bpstat_copy (tp->stop_bpstat);
inf_status->breakpoint_proceeded = breakpoint_proceeded;
inf_status->proceed_to_finish = tp->proceed_to_finish;
inf_status->in_infcall = tp->in_infcall;
@ -5089,7 +5088,6 @@ restore_inferior_status (struct inferior_status *inf_status)
bpstat_clear (&tp->stop_bpstat);
tp->stop_bpstat = inf_status->stop_bpstat;
inf_status->stop_bpstat = NULL;
breakpoint_proceeded = inf_status->breakpoint_proceeded;
tp->proceed_to_finish = inf_status->proceed_to_finish;
tp->in_infcall = inf_status->in_infcall;

View File

@ -61,6 +61,7 @@ static void mi_inferior_exit (int pid);
static void mi_on_resume (ptid_t ptid);
static void mi_solib_loaded (struct so_list *solib);
static void mi_solib_unloaded (struct so_list *solib);
static void mi_about_to_proceed (void);
static void *
mi_interpreter_init (int top_level)
@ -91,6 +92,7 @@ mi_interpreter_init (int top_level)
observer_attach_target_resumed (mi_on_resume);
observer_attach_solib_loaded (mi_solib_loaded);
observer_attach_solib_unloaded (mi_solib_unloaded);
observer_attach_about_to_proceed (mi_about_to_proceed);
}
return mi;
@ -367,6 +369,21 @@ mi_on_normal_stop (struct bpstats *bs, int print_frame)
gdb_flush (raw_stdout);
}
static void
mi_about_to_proceed (void)
{
/* Suppress output while calling an inferior function. */
if (!ptid_equal (inferior_ptid, null_ptid))
{
struct thread_info *tp = inferior_thread ();
if (tp->in_infcall)
return;
}
mi_proceeded = 1;
}
static void
mi_on_resume (ptid_t ptid)
{
@ -389,7 +406,7 @@ mi_on_resume (ptid_t ptid)
will make it impossible for frontend to know what's going on.
In future (MI3), we'll be outputting "^done" here. */
if (!running_result_record_printed)
if (!running_result_record_printed && mi_proceeded)
{
if (current_token)
fputs_unfiltered (current_token, raw_stdout);
@ -411,7 +428,7 @@ mi_on_resume (ptid_t ptid)
fprintf_unfiltered (raw_stdout, "*running,thread-id=\"%d\"\n", ti->num);
}
if (!running_result_record_printed)
if (!running_result_record_printed && mi_proceeded)
{
running_result_record_printed = 1;
/* This is what gdb used to do historically -- printing prompt even if

View File

@ -78,6 +78,10 @@ static int do_timings = 0;
char *current_token;
int running_result_record_printed = 1;
/* Flag indicating that the target has proceeded since the last
command was issued. */
int mi_proceeded;
extern void _initialize_mi_main (void);
static void mi_cmd_execute (struct mi_parse *parse);
@ -1147,6 +1151,7 @@ captured_mi_execute_command (struct ui_out *uiout, void *data)
cleanup = make_cleanup (free_current_contents, &current_token);
running_result_record_printed = 0;
mi_proceeded = 0;
switch (context->op)
{
case MI_COMMAND:

View File

@ -31,6 +31,7 @@ extern void mi_print_timing_maybe (void);
extern char *current_token;
extern int running_result_record_printed;
extern int mi_proceeded;
#endif