namespace simgrid {
namespace surf {
-surf_callback(void, void) surfExitCallbacks;
+simgrid::surf::signal<void(void)> surfExitCallbacks;
}
}
xbt_dynar_free(&model_list_invoke);
routing_exit();
- surf_callback_emit(simgrid::surf::surfExitCallbacks);
+ simgrid::surf::surfExitCallbacks();
if (maxmin_system) {
lmm_system_free(maxmin_system);
namespace surf {
Resource::Resource()
-: p_name(NULL), p_properties(NULL), p_model(NULL)
+: p_name(NULL), p_model(NULL)
{}
-Resource::Resource(Model *model, const char *name, xbt_dict_t props)
- : Resource(model, name, props, SURF_RESOURCE_ON)
+Resource::Resource(Model *model, const char *name)
+ : Resource(model, name, SURF_RESOURCE_ON)
{}
-Resource::Resource(Model *model, const char *name, xbt_dict_t props, lmm_constraint_t constraint)
- : Resource(model, name, props, constraint, SURF_RESOURCE_ON)
+Resource::Resource(Model *model, const char *name, lmm_constraint_t constraint)
+ : Resource(model, name, constraint, SURF_RESOURCE_ON)
{}
Resource::Resource(
- Model *model, const char *name, xbt_dict_t props,
+ Model *model, const char *name,
lmm_constraint_t constraint, e_surf_resource_state_t stateInit)
- : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
+ : p_name(xbt_strdup(name)), p_model(model)
, m_running(true), m_stateCurrent(stateInit), p_constraint(constraint)
{}
-Resource::Resource(Model *model, const char *name, xbt_dict_t props, e_surf_resource_state_t stateInit)
- : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
+Resource::Resource(Model *model, const char *name, e_surf_resource_state_t stateInit)
+ : p_name(xbt_strdup(name)), p_model(model)
, 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);
- xbt_dict_free(&p_properties);
}
e_surf_resource_state_t Resource::getState()
return p_name;
}
-xbt_dict_t Resource::getProperties() {
- if (p_properties==NULL)
- p_properties = xbt_dict_new();
- return p_properties;
-}
-
lmm_constraint_t Resource::getConstraint() {
return p_constraint;
}