Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[surf] Triggers the destructed callbacks on the full object
[simgrid.git] / src / surf / surf_interface.cpp
index 3f7d33a..2f5bc3b 100644 (file)
@@ -614,7 +614,34 @@ Resource::Resource(Model *model, const char *name, e_surf_resource_state_t state
   , m_running(true), m_stateCurrent(stateInit)
 {}
 
   , m_running(true), m_stateCurrent(stateInit)
 {}
 
+/** Cleanup code of the full object.
+ *
+ *  The destructed callbacks might need to have a fully
+ *  created `Cpu` instance so they cannot be called `~Cpu()`
+ *  (at this point the fields of the parents have been destroyed
+ *  and the virtual methods are the ones of `Cpu`). If a `Cpu`
+ *  subclass overrides any virtual method, it should call this
+ *  method at the beginning of the destructor in order to trigger
+ *  the callbacks in the real state of the Cpu.
+ *
+ *  Once the method has been called once, it becomes a noop ensuring
+ *  that the callbacks are not for each class of the hierarchy.
+ *
+ *  A better solution would be to call a `Cpu::destroy()` method
+ *  before calling the destructor and trigger the callbacks here.
+ */
+void Resource::die()
+{
+  if (alive_) {
+    onDie();
+    alive_ = false;
+  }
+}
+
+void Resource::onDie() {}
+
 Resource::~Resource() {
 Resource::~Resource() {
+  this->die();
   xbt_free((void*)p_name);
 }
 
   xbt_free((void*)p_name);
 }