sim: make ProbeListener satisfy the rule of five with deleted
authorCiro Santilli <ciro.santilli@arm.com>
Tue, 24 Nov 2020 13:22:03 +0000 (13:22 +0000)
committerCiro Santilli <ciro.santilli@arm.com>
Thu, 26 Nov 2020 16:25:10 +0000 (16:25 +0000)
Since this class has a custom destructor ~ProbeListener(), it should
also generally have the 4 other methods defined, otherwise calling
those methods lead to subtle failures.

In this specific case, the ProbeManager *const manager; field stores a
pointer back to the ProbeListener object at:

ProbeListener::ProbeListener {
    manager->addListener(name, *this);

which gets unregistered by the destructor:

ProbeListener::~ProbeListener()
    manager->removeListener(name, *this);

and because the default copy does not re-register anything, it leads to
unregistration.

Therefore, a copy constructor would need the manager to support multiple
identical listeners, or at least refcount them, which would be overkill.

The two move operations would be more feasible, as we could make them
unregister the old ProbeListener address and then re-register the new one,
but that is not very efficient, so we just delete them as well.

A consequence of not implementing the move methods is that it is
impossible to store ProbeListener inside an std::vector. since objects
inside std::vector may need to be moved in memory when the vector resizes,
and therefore need to be movable. The alternative is to use an std::vector
of std::unique_ptr instead.

Change-Id: I8dc0157665391f86e2ca81d144bc6a42e9312d6c
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/37977
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/sim/probe/probe.hh

index 97edf0bd752a41e6d067524fbedc84ae26bd7580..57132fc8b4c3b6fdb5f99301380c2b4116ae3295 100644 (file)
@@ -119,6 +119,10 @@ class ProbeListener
   public:
     ProbeListener(ProbeManager *manager, const std::string &name);
     virtual ~ProbeListener();
+    ProbeListener(const ProbeListener& other) = delete;
+    ProbeListener& operator=(const ProbeListener& other) = delete;
+    ProbeListener(ProbeListener&& other) noexcept = delete;
+    ProbeListener& operator=(ProbeListener&& other) noexcept = delete;
 
   protected:
     ProbeManager *const manager;