Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Bug fix : we could get stuck into an infinite loop for floating point precision reason.
authoralegrand <alegrand@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 26 Jan 2005 17:25:49 +0000 (17:25 +0000)
committeralegrand <alegrand@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 26 Jan 2005 17:25:49 +0000 (17:25 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@770 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/surf/cpu.c
src/surf/network.c
src/surf/surf_private.h

index d748240..5a5dc18 100644 (file)
@@ -149,10 +149,10 @@ static void update_actions_state(double now, double delta)
       surf_cpu_resource->common_public->states.failed_action_set;
 
   xbt_swag_foreach_safe(action, next_action, running_actions) {
-    action->generic_action.remains -=
-       lmm_variable_getvalue(action->variable) * delta;
+    surf_double_update(&(action->generic_action.remains),
+       lmm_variable_getvalue(action->variable) * delta);
     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 <= 0) && 
        (lmm_get_variable_weight(action->variable)>0)) {
       action->generic_action.finish = surf_get_clock();
index 278237d..c3cfc65 100644 (file)
@@ -269,19 +269,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; */
 
index f819a09..ca40937 100644 (file)
@@ -46,6 +46,11 @@ void surf_action_set_data(surf_action_t action,
                          void *data);
 FILE *surf_fopen(const char *name, const char *mode);
 
+static _XBT_INLINE void surf_double_update(double *variable, double value) 
+{
+  *variable -= value;
+  if(*variable< 0.00001) *variable = 0.0;
+}
 extern lmm_system_t maxmin_system;
 extern tmgr_history_t history;
 extern xbt_dynar_t surf_path;