summaryrefslogtreecommitdiff
path: root/src/sim
diff options
context:
space:
mode:
authorAndreas Sandberg <Andreas.Sandberg@ARM.com>2014-09-09 04:36:43 -0400
committerAndreas Sandberg <Andreas.Sandberg@ARM.com>2014-09-09 04:36:43 -0400
commit53a24b01ab93a35ccd6acc0ac9776b1a036b1d0e (patch)
treeaaba44a6e3e3574c9a59f3bc780aa8cf97c1e0b7 /src/sim
parentb0e4de667a7d0d51ac0667ce1e48f13b2cb17716 (diff)
downloadgem5-53a24b01ab93a35ccd6acc0ac9776b1a036b1d0e.tar.xz
sim: Automatically unregister probe listeners
The ProbeListener base class automatically registers itself with a probe manager. Currently, the class does not unregister a itself when it is destroyed, which makes removing probes listeners somewhat cumbersome. This patch adds an automatic call to manager->removeListener in the ProbeListener destructor, which solves the problem.
Diffstat (limited to 'src/sim')
-rw-r--r--src/sim/probe/probe.cc8
-rw-r--r--src/sim/probe/probe.hh6
2 files changed, 12 insertions, 2 deletions
diff --git a/src/sim/probe/probe.cc b/src/sim/probe/probe.cc
index 6f1a3d535..600d9dcc4 100644
--- a/src/sim/probe/probe.cc
+++ b/src/sim/probe/probe.cc
@@ -62,11 +62,17 @@ ProbeListenerObject::~ProbeListenerObject()
listeners.clear();
}
-ProbeListener::ProbeListener(ProbeManager *manager, const std::string &name)
+ProbeListener::ProbeListener(ProbeManager *_manager, const std::string &_name)
+ : manager(_manager), name(_name)
{
manager->addListener(name, *this);
}
+ProbeListener::~ProbeListener()
+{
+ manager->removeListener(name, *this);
+}
+
ProbeListenerObject*
ProbeListenerObjectParams::create()
{
diff --git a/src/sim/probe/probe.hh b/src/sim/probe/probe.hh
index 5a0bf11c9..2946f4664 100644
--- a/src/sim/probe/probe.hh
+++ b/src/sim/probe/probe.hh
@@ -104,7 +104,11 @@ class ProbeListener
{
public:
ProbeListener(ProbeManager *manager, const std::string &name);
- virtual ~ProbeListener() {}
+ virtual ~ProbeListener();
+
+ protected:
+ ProbeManager *const manager;
+ const std::string name;
};
/**