Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Clean bound in surf
[simgrid.git] / src / surf / surf_interface.cpp
index c21635b..4378973 100644 (file)
@@ -90,6 +90,8 @@ xbt_dynar_t surf_path = NULL;
 xbt_dynar_t host_that_restart = NULL;
 xbt_dict_t watched_hosts_lib;
 
+surf_callback(void, void) surfExitCallbacks;
+
 s_surf_model_description_t surf_plugin_description[] = {
                  {"Energy",
                   "Cpu energy consumption.",
@@ -154,7 +156,7 @@ s_surf_model_description_t surf_workstation_model_description[] = {
 
 s_surf_model_description_t surf_vm_workstation_model_description[] = {
   {"default",
-   "Default vm workstation model.)",
+   "Default vm workstation model.",
    surf_vm_workstation_model_init_current_default},
   {NULL, NULL, NULL}      /* this array must be NULL terminated */
 };
@@ -426,12 +428,25 @@ void surf_exit(void)
 
   sg_config_finalize();
 
+  xbt_dynar_free(&host_that_restart);
+  xbt_dynar_free(&surf_path);
+
+  xbt_lib_free(&host_lib);
+  xbt_lib_free(&link_lib);
+  xbt_lib_free(&as_router_lib);
+  xbt_lib_free(&storage_lib);
+  xbt_lib_free(&storage_type_lib);
+
+  xbt_dict_free(&watched_hosts_lib);
+
   xbt_dynar_foreach(model_list, iter, model)
     delete model;
   xbt_dynar_free(&model_list);
   xbt_dynar_free(&model_list_invoke);
   routing_exit();
 
+  surf_callback_emit(surfExitCallbacks);
+
   if (maxmin_system) {
     lmm_system_free(maxmin_system);
     maxmin_system = NULL;
@@ -448,17 +463,6 @@ void surf_exit(void)
   xbt_free(surf_mins);
   surf_mins = NULL;
 
-  xbt_dynar_free(&host_that_restart);
-  xbt_dynar_free(&surf_path);
-
-  xbt_lib_free(&host_lib);
-  xbt_lib_free(&link_lib);
-  xbt_lib_free(&as_router_lib);
-  xbt_lib_free(&storage_lib);
-  xbt_lib_free(&storage_type_lib);
-
-  xbt_dict_free(&watched_hosts_lib);
-
   tmgr_finalize();
   surf_parse_lex_destroy();
   surf_parse_free_callbacks();
@@ -471,8 +475,8 @@ void surf_exit(void)
  *********/
 
 Model::Model(const char *name)
-  : p_name(name)
-  , p_maxminSystem(NULL)
+  : p_maxminSystem(NULL)
+  , p_name(name)
 {
   p_readyActionSet = new ActionList();
   p_runningActionSet = new ActionList();
@@ -537,7 +541,7 @@ double Model::shareResourcesLazy(double now)
     value = lmm_variable_getvalue(action->getVariable());
     if (value > 0) {
       if (action->getRemains() > 0) {
-        value = action->getRemains() / value;
+        value = action->getRemainsNoUpdate() / value;
         min = now + value;
       } else {
         value = 0.0;
@@ -604,7 +608,7 @@ double Model::shareResourcesMaxMin(ActionListPtr running_actions,
 
   if (value > 0) {
     if (action->getRemains() > 0)
-      min = action->getRemains() / value;
+      min = action->getRemainsNoUpdate() / value;
     else
       min = 0.0;
     if ((action->getMaxDuration() >= 0) && (action->getMaxDuration() < min))
@@ -618,7 +622,7 @@ double Model::shareResourcesMaxMin(ActionListPtr running_actions,
     value = lmm_variable_getvalue(action->getVariable());
     if (value > 0) {
       if (action->getRemains() > 0)
-        value = action->getRemains() / value;
+        value = action->getRemainsNoUpdate() / value;
       else
         value = 0.0;
       if (value < min) {
@@ -663,18 +667,18 @@ Resource::Resource()
 {}
 
 Resource::Resource(surf_model_t model, const char *name, xbt_dict_t props)
- : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
- , m_running(true), m_stateCurrent(SURF_RESOURCE_ON)
 : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
 , m_running(true), m_stateCurrent(SURF_RESOURCE_ON)
 {}
 
 Resource::Resource(surf_model_t model, const char *name, xbt_dict_t props, lmm_constraint_t constraint)
- : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
- , m_running(true), m_stateCurrent(SURF_RESOURCE_ON), p_constraint(constraint)
 : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
 , m_running(true), m_stateCurrent(SURF_RESOURCE_ON), p_constraint(constraint)
 {}
 
 Resource::Resource(surf_model_t 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)
- , m_running(true), m_stateCurrent(stateInit)
 : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
 , m_running(true), m_stateCurrent(stateInit)
 {}
 
 Resource::~Resource() {
@@ -746,18 +750,19 @@ Action::Action()
 
 Action::Action(ModelPtr model, double cost, bool failed)
  : m_priority(1.0)
- , m_failed(failed)
- , m_start(surf_get_clock()), m_finish(-1.0)
+ , m_refcount(1)
  , m_remains(cost)
  , m_maxDuration(NO_MAX_DURATION)
+ , m_finish(-1.0)
+ , m_failed(failed)
+ , m_start(surf_get_clock())
  , m_cost(cost)
- , p_data(NULL)
  , p_model(model)
- , m_refcount(1)
+ , p_data(NULL)
+ , p_variable(NULL)
  , m_lastValue(0)
  , m_lastUpdate(0)
  , m_suspended(false)
- , p_variable(NULL)
 {
   #ifdef HAVE_TRACING
     p_category = NULL;
@@ -774,18 +779,19 @@ Action::Action(ModelPtr model, double cost, bool failed)
 
 Action::Action(ModelPtr model, double cost, bool failed, lmm_variable_t var)
  : m_priority(1.0)
- , m_failed(failed)
- , m_start(surf_get_clock()), m_finish(-1.0)
+ , m_refcount(1)
  , m_remains(cost)
  , m_maxDuration(NO_MAX_DURATION)
+ , m_finish(-1.0)
+ , m_failed(failed)
+ , m_start(surf_get_clock())
  , m_cost(cost)
- , p_data(NULL)
  , p_model(model)
- , m_refcount(1)
+ , p_data(NULL)
+ , p_variable(var)
  , m_lastValue(0)
  , m_lastUpdate(0)
  , m_suspended(false)
- , p_variable(var)
 {
   #ifdef HAVE_TRACING
     p_category = NULL;
@@ -844,6 +850,22 @@ void Action::setState(e_surf_action_state_t state)
   XBT_OUT();
 }
 
+double Action::getBound()
+{
+  return (p_variable) ? lmm_variable_getbound(p_variable) : 0;
+}
+
+void Action::setBound(double bound)
+{
+  XBT_IN("(%p,%g)", this, bound);
+  if (p_variable)
+    lmm_update_variable_bound(getModel()->getMaxminSystem(), getVariable(), bound);
+
+  if (getModel()->getUpdateMechanism() == UM_LAZY)
+       heapRemove(getModel()->getActionHeap());
+  XBT_OUT();
+}
+
 double Action::getStartTime()
 {
   return m_start;