static void * mi_interpreter_init (int top_level) { struct mi_interp *mi = XMALLOC (struct mi_interp); /* HACK: We need to force stdout/stderr to point at the console. This avoids any potential side effects caused by legacy code that is still using the TUI / fputs_unfiltered_hook. So we set up output channels for this now, and swap them in when we are run. */ raw_stdout = stdio_fileopen (stdout); /* Create MI channels */ mi->out = mi_console_file_new (raw_stdout, "~", '"'); mi->err = mi_console_file_new (raw_stdout, "&", '"'); mi->log = mi->err; mi->targ = mi_console_file_new (raw_stdout, "@", '"'); mi->event_channel = mi_console_file_new (raw_stdout, "=", 0); if (top_level) { observer_attach_new_thread (mi_new_thread); observer_attach_thread_exit (mi_thread_exit); observer_attach_inferior_added (mi_inferior_added); observer_attach_inferior_appeared (mi_inferior_appeared); observer_attach_inferior_exit (mi_inferior_exit); observer_attach_inferior_removed (mi_inferior_removed); observer_attach_normal_stop (mi_on_normal_stop); 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); /* The initial inferior is created before this function is called, so we need to report it explicitly. Use iteration in case future version of GDB creates more than one inferior up-front. */ iterate_over_inferiors (report_initial_inferior, mi); } return mi; }
static void * mi_interpreter_init (struct interp *interp, int top_level) { struct mi_interp *mi = XNEW (struct mi_interp); const char *name; int mi_version; /* Assign the output channel created at startup to its own global, so that we can create a console channel that encapsulates and prefixes all gdb_output-type bits coming from the rest of the debugger. */ raw_stdout = gdb_stdout; /* Create MI console channels, each with a different prefix so they can be distinguished. */ mi->out = mi_console_file_new (raw_stdout, "~", '"'); mi->err = mi_console_file_new (raw_stdout, "&", '"'); mi->log = mi->err; mi->targ = mi_console_file_new (raw_stdout, "@", '"'); mi->event_channel = mi_console_file_new (raw_stdout, "=", 0); name = interp_name (interp); /* INTERP_MI selects the most recent released version. "mi2" was released as part of GDB 6.0. */ if (strcmp (name, INTERP_MI) == 0) mi_version = 2; else if (strcmp (name, INTERP_MI1) == 0) mi_version = 1; else if (strcmp (name, INTERP_MI2) == 0) mi_version = 2; else if (strcmp (name, INTERP_MI3) == 0) mi_version = 3; else gdb_assert_not_reached ("unhandled MI version"); mi->mi_uiout = mi_out_new (mi_version); mi->cli_uiout = cli_out_new (mi->out); /* There are installed even if MI is not the top level interpreter. The callbacks themselves decide whether to be skipped. */ observer_attach_signal_received (mi_on_signal_received); observer_attach_end_stepping_range (mi_on_end_stepping_range); observer_attach_signal_exited (mi_on_signal_exited); observer_attach_exited (mi_on_exited); observer_attach_no_history (mi_on_no_history); if (top_level) { observer_attach_new_thread (mi_new_thread); observer_attach_thread_exit (mi_thread_exit); observer_attach_inferior_added (mi_inferior_added); observer_attach_inferior_appeared (mi_inferior_appeared); observer_attach_inferior_exit (mi_inferior_exit); observer_attach_inferior_removed (mi_inferior_removed); observer_attach_record_changed (mi_record_changed); observer_attach_normal_stop (mi_on_normal_stop); 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); observer_attach_traceframe_changed (mi_traceframe_changed); observer_attach_tsv_created (mi_tsv_created); observer_attach_tsv_deleted (mi_tsv_deleted); observer_attach_tsv_modified (mi_tsv_modified); observer_attach_breakpoint_created (mi_breakpoint_created); observer_attach_breakpoint_deleted (mi_breakpoint_deleted); observer_attach_breakpoint_modified (mi_breakpoint_modified); observer_attach_command_param_changed (mi_command_param_changed); observer_attach_memory_changed (mi_memory_changed); observer_attach_sync_execution_done (mi_on_sync_execution_done); /* The initial inferior is created before this function is called, so we need to report it explicitly. Use iteration in case future version of GDB creates more than one inferior up-front. */ iterate_over_inferiors (report_initial_inferior, mi); } return mi; }