+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.
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)
{
}
}
+/* 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)
&breakpoint_show_cmdlist);
automatic_hardware_breakpoints = 1;
+
+ observer_attach_about_to_proceed (breakpoint_about_to_proceed);
}
+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
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.
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;
}
stop_after_trap = 0;
- breakpoint_proceeded = 1; /* We're about to proceed... */
+
+ observer_notify_about_to_proceed ();
if (stop_registers)
{
/* 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;
};
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;
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;
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)
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;
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)
{
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);
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
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);
cleanup = make_cleanup (free_current_contents, ¤t_token);
running_result_record_printed = 0;
+ mi_proceeded = 0;
switch (context->op)
{
case MI_COMMAND:
extern char *current_token;
extern int running_result_record_printed;
+extern int mi_proceeded;
#endif