From: alegrand Date: Wed, 26 Jan 2005 17:25:49 +0000 (+0000) Subject: Bug fix : we could get stuck into an infinite loop for floating point precision reason. X-Git-Tag: v3.3~4580 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/045febe057cdab268bf1d2aedae1f6db9333672d Bug fix : we could get stuck into an infinite loop for floating point precision reason. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@770 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/surf/cpu.c b/src/surf/cpu.c index d748240560..5a5dc18ac9 100644 --- a/src/surf/cpu.c +++ b/src/surf/cpu.c @@ -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(); diff --git a/src/surf/network.c b/src/surf/network.c index 278237da76..c3cfc6580e 100644 --- a/src/surf/network.c +++ b/src/surf/network.c @@ -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; */ diff --git a/src/surf/surf_private.h b/src/surf/surf_private.h index f819a0987c..ca40937ac2 100644 --- a/src/surf/surf_private.h +++ b/src/surf/surf_private.h @@ -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;