X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/58de6e0115d311e93b28c712e9e74b89fd81d40a..736f038a333b21482b9e73ed2860a7f096e29ac8:/src/surf/host_interface.cpp diff --git a/src/surf/host_interface.cpp b/src/surf/host_interface.cpp index 3d08ac4e44..85dc8b73fc 100644 --- a/src/surf/host_interface.cpp +++ b/src/surf/host_interface.cpp @@ -79,10 +79,14 @@ simgrid::surf::signal Host::onCreation; simgrid::surf::signal Host::onDestruction; simgrid::surf::signal Host::onStateChange; -void Host::init() +static void host_destroy(void *h){ + static_cast(h)->destroy(); +} + +void Host::classInit() { if (!EXTENSION_ID.valid()) { - EXTENSION_ID = simgrid::Host::extension_create(); + EXTENSION_ID = simgrid::Host::extension_create(host_destroy); SURF_HOST_LEVEL = EXTENSION_ID.id(); // FIXME: KILLME } } @@ -105,15 +109,22 @@ Host::Host(simgrid::surf::Model *model, const char *name, xbt_dict_t props, lmm_ p_params.ramsize = 0; } -void Host::onDie() +/** @brief use destroy() instead of this destructor */ +Host::~Host() { - onDestruction(this); - Resource::onDie(); + xbt_assert(currentlyDestroying_, "Don't delete Hosts directly. Call destroy() instead."); } - -Host::~Host() +/** @brief Fire the require callbacks and destroy the object + * + * Don't delete directly an Host, call h->destroy() instead. + */ +void Host::destroy() { - this->die(); + if (!currentlyDestroying_) { + currentlyDestroying_ = true; + onDestruction(this); + delete this; + } } void Host::attach(simgrid::Host* host)