mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-25 08:47:28 +00:00
Instead of having the interpreter code registering observers for the signal_received observable, add a "signal_received" virtual method to struct interp. Add a interps_notify_signal_received function that loops over all UIs and calls the signal_received method on the interpreter. Finally, add a notify_signal_received function that calls interps_notify_signal_received and then notifies the observers. Replace all existing notifications to the signal_received observers with calls to notify_signal_received. Before this patch, the CLI and MI code both register a signal_received observer. These observer go over all UIs, and, for those that have a interpreter of the right kind, print the stop notifiation. After this patch, we have just one "loop over all UIs", inside interps_notify_signal_received. Since the interp::on_signal_received method gets called once for each interpreter, the implementations only need to deal with the current interpreter (the "this" pointer). The motivation for this patch comes from a future patch, that makes the amdgpu code register an observer to print a warning after the CLI's signal stop message. Since the amdgpu and the CLI code both use observers, the order of the two messages is not stable, unless we define the priority using the observer dependency system. However, the approach of using virtual methods on the interpreters seems like a good change anyway, I think it's more straightforward and simple to understand than the current solution that uses observers. We are sure that the amdgpu message gets printed after the CLI message, since observers are notified after interpreters. Keep the signal_received, even if nothing uses if, because we will be using it in the upcoming amdgpu patch implementing the warning described above. Change-Id: I4d8614bb8f6e0717f4bfc2a59abded3702f23ac4
66 lines
2.0 KiB
C++
66 lines
2.0 KiB
C++
/* CLI Definitions for GDB, the GNU debugger.
|
|
|
|
Copyright (C) 2016-2023 Free Software Foundation, Inc.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef CLI_CLI_INTERP_H
|
|
#define CLI_CLI_INTERP_H
|
|
|
|
#include "interps.h"
|
|
|
|
/* A console-like interpreter. Implements functionality common to the
|
|
CLI and the TUI. */
|
|
class cli_interp_base : public interp
|
|
{
|
|
public:
|
|
explicit cli_interp_base (const char *name);
|
|
virtual ~cli_interp_base () = 0;
|
|
|
|
void set_logging (ui_file_up logfile, bool logging_redirect,
|
|
bool debug_redirect) override;
|
|
void pre_command_loop () override;
|
|
bool supports_command_editing () override;
|
|
|
|
void on_signal_received (gdb_signal sig) override;
|
|
|
|
private:
|
|
struct saved_output_files
|
|
{
|
|
/* Saved gdb_stdout, gdb_stderr, etc. */
|
|
ui_file *out;
|
|
ui_file *err;
|
|
ui_file *log;
|
|
ui_file *targ;
|
|
ui_file *targerr;
|
|
/* When redirecting, some or all of these may be non-null
|
|
depending on the logging mode. */
|
|
ui_file_up stdout_holder;
|
|
ui_file_up stderr_holder;
|
|
ui_file_up stdlog_holder;
|
|
ui_file_up logfile_holder;
|
|
};
|
|
|
|
/* These hold the pushed copies of the gdb output files. If NULL
|
|
then nothing has yet been pushed. */
|
|
std::unique_ptr<saved_output_files> m_saved_output;
|
|
};
|
|
|
|
/* Returns true if the current stop should be printed to
|
|
CONSOLE_INTERP. */
|
|
extern int should_print_stop_to_console (struct interp *interp,
|
|
struct thread_info *tp);
|
|
|
|
#endif /* CLI_CLI_INTERP_H */
|