Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
More verbose messages on errors
[simgrid.git] / src / surf / network.c
index 278237d..9ed263c 100644 (file)
@@ -210,10 +210,9 @@ static int resource_used(void *resource_id)
 
 static void action_free(surf_action_t action)
 {
-  surf_action_network_t Action = (surf_action_network_t) action;
-
   xbt_swag_remove(action, action->state_set);
-  lmm_variable_free(maxmin_system, Action->variable);
+  if(((surf_action_network_t)action)->variable)
+    lmm_variable_free(maxmin_system, ((surf_action_network_t)action)->variable);
   xbt_free(action);
 
   return;
@@ -232,6 +231,12 @@ static void action_recycle(surf_action_t action)
 static void action_change_state(surf_action_t action,
                                e_surf_action_state_t state)
 {
+  if((state==SURF_ACTION_DONE) || (state==SURF_ACTION_FAILED))
+    if(((surf_action_network_t)action)->variable) {
+      lmm_variable_disable(maxmin_system, ((surf_action_network_t)action)->variable);
+      ((surf_action_network_t)action)->variable = NULL;
+    }
+
   surf_action_change_state(action, state);
   return;
 }
@@ -269,19 +274,19 @@ static void update_actions_state(double now, double delta)
     deltap = delta;
     if (action->latency > 0) {
       if (action->latency > deltap) {
-       action->latency -= deltap;
+       surf_double_update(&(action->latency),deltap);
        deltap = 0.0;
       } else {
-       deltap -= action->latency;
+       surf_double_update(&(deltap), action->latency);
        action->latency = 0.0;
       }
       if ((action->latency == 0.0) && !(action->suspended)) 
        lmm_update_variable_weight(maxmin_system, action->variable, 1.0);
     }
-    action->generic_action.remains -=
-       lmm_variable_getvalue(action->variable) * deltap;
+    surf_double_update(&(action->generic_action.remains),
+       lmm_variable_getvalue(action->variable) * deltap);
     if (action->generic_action.max_duration != NO_MAX_DURATION)
-      action->generic_action.max_duration -= delta;
+      surf_double_update(&(action->generic_action.max_duration), delta);
 
     /*   if(action->generic_action.remains<.00001) action->generic_action.remains=0; */
 
@@ -310,10 +315,6 @@ static void update_actions_state(double now, double delta)
     }
   }
 
-  xbt_swag_foreach_safe(action, next_action, failed_actions) {
-    lmm_variable_disable(maxmin_system, action->variable);
-  }
-
   return;
 }
 
@@ -403,6 +404,10 @@ static surf_action_t communicate(void *src, void *dst, double size, double rate)
     lmm_update_variable_bound(maxmin_system, action->variable,
                              min(action->rate,SG_TCP_CTE_GAMMA / action->lat_current));
 
+  if(route_size == 0) {
+    action_change_state((surf_action_t) action, SURF_ACTION_DONE);
+  }
+
   for (i = 0; i < route_size; i++)
     lmm_expand(maxmin_system, route[i]->constraint, action->variable, 1.0);