X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d0e24e71be9100371207e703e25cab7d612f521c..ccc1670e4bf36086f1f524b5ef004d5210415488:/src/surf/surf_interface.cpp diff --git a/src/surf/surf_interface.cpp b/src/surf/surf_interface.cpp index 3f7d33a191..2f5bc3bd76 100644 --- a/src/surf/surf_interface.cpp +++ b/src/surf/surf_interface.cpp @@ -614,7 +614,34 @@ Resource::Resource(Model *model, const char *name, e_surf_resource_state_t state , 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() { + this->die(); xbt_free((void*)p_name); }