[PATCH 2/2] Add a new IDebugger::re_run entry point
- From: Dodji Seketeli <dodji seketeli org>
- To: Nemiver Development <nemiver-list gnome org>
- Subject: [PATCH 2/2] Add a new IDebugger::re_run entry point
- Date: Mon, 11 Jun 2012 00:02:56 +0200
Hello,
This patch adds a new IDebugger::re_run entry point that re-starts the
inferior. This helps factorize a set of calls that were previously
done in the perspective, back into the debugging engine. It also
provides client code with a signal that fires when the inferior is
restarted. This simplifies the code of the client function
DBGPerspective::on_debugger_detached_from_target_signal.
Tested and applied to master.
* src/dbgengine/nmv-i-debugger.h
(IDebugger::inferior_re_run_signal, IDebugger::re_run): New entry
points.
* src/dbgengine/nmv-gdb-engine.h
(GDBEngine::inferior_re_run_signal, GDBEngine::re_run): New
functions.
* src/dbgengine/nmv-gdb-engine.cc
(GDBEngine::Priv::inferior_re_run_signal): New member.
(OnRunningHandler::do_handle): Handle new "re-run" command.
(GDBEngine::inferior_re_run_signal, GDBEngine::re_run): New
function.
* src/persp/dbgperspective/nmv-dbg-perspective.cc
(DBGPerspective::on_debugger_inferior_re_run_signal): New
function.
(DBGPerspective::restart_local_inferior): Use the new
IDebugger::re_run function.
---
src/dbgengine/nmv-gdb-engine.cc | 44 +++++++++++++++++++++++
src/dbgengine/nmv-gdb-engine.h | 6 +++-
src/dbgengine/nmv-i-debugger.h | 6 +++
src/persp/dbgperspective/nmv-dbg-perspective.cc | 26 +++++++++----
4 files changed, 73 insertions(+), 9 deletions(-)
diff --git a/src/dbgengine/nmv-gdb-engine.cc b/src/dbgengine/nmv-gdb-engine.cc
index 1c281fb..ebee5eb 100644
--- a/src/dbgengine/nmv-gdb-engine.cc
+++ b/src/dbgengine/nmv-gdb-engine.cc
@@ -60,6 +60,7 @@ using nemiver::debugger_utils::null_const_variable_list_slot;
using nemiver::debugger_utils::null_frame_vector_slot;
using nemiver::debugger_utils::null_frame_args_slot;
using nemiver::debugger_utils::null_disass_slot;
+using nemiver::debugger_utils::null_default_slot;
using nemiver::debugger_utils::null_breakpoints_slot;
static const char* GDBMI_OUTPUT_DOMAIN = "gdbmi-output-domain";
@@ -257,6 +258,8 @@ public:
mutable sigc::signal<void> connected_to_server_signal;
mutable sigc::signal<void> detached_from_target_signal;
+
+ mutable sigc::signal<void> inferior_re_run_signal;
mutable sigc::signal<void,
const map<int, IDebugger::Breakpoint>&,
@@ -1855,6 +1858,16 @@ struct OnRunningHandler : OutputHandler {
IDebugger::DefaultSlot s = c.get_slot<IDebugger::DefaultSlot> ();
s ();
}
+
+ if (a_in.command ().name () == "re-run") {
+ if (a_in.command ().has_slot ()) {
+ typedef sigc::slot<void> SlotType;
+ SlotType slot = a_in.command ().get_slot<SlotType> ();
+ slot ();
+ }
+ m_engine->inferior_re_run_signal ().emit ();
+ }
+
m_engine->running_signal ().emit ();
}
};//struct OnRunningHandler
@@ -3497,6 +3510,13 @@ GDBEngine::detached_from_target_signal () const
return m_priv->detached_from_target_signal;
}
+/// Return a reference on the IDebugger::inferior_re_run_signal.
+sigc::signal<void>&
+GDBEngine::inferior_re_run_signal () const
+{
+ return m_priv->inferior_re_run_signal;
+}
+
sigc::signal<void, const IDebugger::Breakpoint&, int, const UString&>&
GDBEngine::breakpoint_deleted_signal () const
{
@@ -4198,6 +4218,30 @@ GDBEngine::run (const UString &a_cookie)
queue_command (command);
}
+/// Re-run the inferior. That is, if the inferior is running, stop
+/// it, and re-start it.
+///
+/// \param a_slot the callback slot to invoke upon re-starting
+/// successful restarting of the inferior. Note that this function
+/// also triggers the emitting of the
+/// IDebugger::inferior_re_run_signal signal.
+void
+GDBEngine::re_run (const DefaultSlot &a_slot)
+{
+ LOG_FUNCTION_SCOPE_NORMAL_DD;
+
+ if (is_attached_to_target ()
+ && get_state () == IDebugger::RUNNING)
+ {
+ stop_target ();
+ LOG_DD ("Requested to stop GDB");
+ }
+
+ Command command ("re-run", "-exec-run");
+ command.set_slot (a_slot);
+ queue_command (command);
+}
+
void
GDBEngine::get_target_info (const UString &a_cookie)
{
diff --git a/src/dbgengine/nmv-gdb-engine.h b/src/dbgengine/nmv-gdb-engine.h
index 88a5816..8eb1233 100644
--- a/src/dbgengine/nmv-gdb-engine.h
+++ b/src/dbgengine/nmv-gdb-engine.h
@@ -69,6 +69,8 @@ public:
sigc::signal<void>& detached_from_target_signal () const;
+ sigc::signal<void>& inferior_re_run_signal () const;
+
sigc::signal<void, const map<int, IDebugger::Breakpoint>&, const UString&>&
breakpoints_list_signal () const;
@@ -327,7 +329,9 @@ public:
void do_continue (const UString &a_cookie);
- void run (const UString &a_cookie) ;
+ void run (const UString &a_cookie);
+
+ void re_run (const DefaultSlot &);
void get_target_info (const UString &a_cookie);
diff --git a/src/dbgengine/nmv-i-debugger.h b/src/dbgengine/nmv-i-debugger.h
index 711feb6..4b48dbd 100644
--- a/src/dbgengine/nmv-i-debugger.h
+++ b/src/dbgengine/nmv-i-debugger.h
@@ -992,6 +992,10 @@ public:
virtual sigc::signal<void>& detached_from_target_signal () const=0;
+ /// Signal emitted whenever the inferior is re-run, using the
+ /// function IDebugger::re_run.
+ virtual sigc::signal<void>& inferior_re_run_signal () const = 0;
+
virtual sigc::signal<void,
const IDebugger::Breakpoint&,
int /*breakpoint command*/,
@@ -1267,6 +1271,8 @@ public:
virtual void run (const UString &a_cookie="") = 0;
+ virtual void re_run (const DefaultSlot &) = 0;
+
virtual IDebugger::State get_state () const = 0;
virtual int get_current_frame_level () const = 0;
diff --git a/src/persp/dbgperspective/nmv-dbg-perspective.cc b/src/persp/dbgperspective/nmv-dbg-perspective.cc
index 7c905af..905a67f 100644
--- a/src/persp/dbgperspective/nmv-dbg-perspective.cc
+++ b/src/persp/dbgperspective/nmv-dbg-perspective.cc
@@ -335,6 +335,8 @@ private:
void on_debugger_connected_to_remote_target_signal ();
+ void on_debugger_inferior_re_run_signal ();
+
void on_debugger_detached_from_target_signal ();
void on_debugger_got_target_info_signal (int a_pid,
@@ -2310,6 +2312,19 @@ DBGPerspective::on_debugger_connected_to_remote_target_signal ()
}
void
+DBGPerspective::on_debugger_inferior_re_run_signal ()
+{
+ LOG_FUNCTION_SCOPE_NORMAL_DD;
+
+ NEMIVER_TRY;
+
+ m_priv->debugger_has_just_run = true;
+ attached_to_target_signal ().emit (true);
+
+ NEMIVER_CATCH;
+}
+
+void
DBGPerspective::on_debugger_detached_from_target_signal ()
{
LOG_FUNCTION_SCOPE_NORMAL_DD;
@@ -5857,15 +5872,10 @@ DBGPerspective::restart_local_inferior ()
// restart; in which case, we can't just simply call debugger
// ()->run ().
&& debugger ()->get_target_path () == m_priv->prog_path) {
- // if the engine is running, stop it.
- if (debugger ()->get_state () == IDebugger::RUNNING) {
- debugger ()->stop_target ();
- LOG_DD ("stopped dbg_engine");
- }
going_to_run_target_signal ().emit ();
- debugger ()->run ();
- m_priv->debugger_has_just_run = true;
- attached_to_target_signal ().emit (true);
+ debugger ()->re_run
+ (sigc::mem_fun
+ (*this, &DBGPerspective::on_debugger_inferior_re_run_signal));
} else {
vector<IDebugger::Breakpoint> bps;
execute_program (m_priv->prog_path, m_priv->prog_args,
--
Dodji
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]