simgrid::surf::signal<void(simgrid::surf::Host*)> Host::onDestruction;
simgrid::surf::signal<void(simgrid::surf::Host*, e_surf_resource_state_t, e_surf_resource_state_t)> Host::onStateChange;
-void Host::init()
+static void host_destroy(void *h){
+ static_cast<simgrid::surf::Host*>(h)->destroy();
+}
+
+void Host::classInit()
{
if (!EXTENSION_ID.valid()) {
- EXTENSION_ID = simgrid::Host::extension_create<simgrid::surf::Host>();
+ EXTENSION_ID = simgrid::Host::extension_create<simgrid::surf::Host>(host_destroy);
SURF_HOST_LEVEL = EXTENSION_ID.id(); // FIXME: KILLME
}
}
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)