X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/eb5b6b0c3c4d9a38bb205b2c8bc9aeeba8674a25..9e821066f7f85d43404ed9ca2f566bf7c718b51a:/src/surf/network_cm02.cpp diff --git a/src/surf/network_cm02.cpp b/src/surf/network_cm02.cpp index 278dacd1c5..37fc2717d8 100644 --- a/src/surf/network_cm02.cpp +++ b/src/surf/network_cm02.cpp @@ -138,7 +138,7 @@ void surf_network_model_init_Reno2(void) xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4); xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor", 0.92); - xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S_parameter", + xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775); } @@ -233,7 +233,6 @@ void NetworkCm02Model::updateActionsStateLazy(double now, double /*delta*/) && (double_equals(xbt_heap_maxkey(p_actionHeap), now, sg_surf_precision))) { action = (NetworkCm02ActionPtr) xbt_heap_pop(p_actionHeap); XBT_DEBUG("Something happened to action %p", action); -#ifdef HAVE_TRACING if (TRACE_is_enabled()) { int n = lmm_get_number_of_cnst_from_var(p_maxminSystem, action->getVariable()); int i; @@ -252,7 +251,6 @@ void NetworkCm02Model::updateActionsStateLazy(double now, double /*delta*/) now - action->getLastUpdate()); } } -#endif // if I am wearing a latency hat if (action->getHat() == LATENCY) { @@ -278,6 +276,77 @@ void NetworkCm02Model::updateActionsStateLazy(double now, double /*delta*/) return; } + +void NetworkCm02Model::updateActionsStateFull(double now, double delta) +{ + NetworkCm02ActionPtr action; + ActionListPtr running_actions = getRunningActionSet(); + + for(ActionList::iterator it(running_actions->begin()), itNext=it, itend(running_actions->end()) + ; it != itend ; it=itNext) { + ++itNext; + + action = (NetworkCm02ActionPtr) &*it; + XBT_DEBUG("Something happened to action %p", action); + double deltap = delta; + if (action->m_latency > 0) { + if (action->m_latency > deltap) { + double_update(&(action->m_latency), deltap, sg_surf_precision); + deltap = 0.0; + } else { + double_update(&(deltap), action->m_latency, sg_surf_precision); + action->m_latency = 0.0; + } + if (action->m_latency == 0.0 && !(action->isSuspended())) + lmm_update_variable_weight(p_maxminSystem, action->getVariable(), + action->m_weight); + } + if (TRACE_is_enabled()) { + int n = lmm_get_number_of_cnst_from_var(p_maxminSystem, action->getVariable()); + int i; + for (i = 0; i < n; i++){ + lmm_constraint_t constraint = lmm_get_cnst_from_var(p_maxminSystem, + action->getVariable(), + i); + NetworkCm02LinkPtr link = static_cast(lmm_constraint_id(constraint)); + TRACE_surf_link_set_utilization(link->getName(), + action->getCategory(), + (lmm_variable_getvalue(action->getVariable())* + lmm_get_cnst_weight_from_var(p_maxminSystem, + action->getVariable(), + i)), + action->getLastUpdate(), + now - action->getLastUpdate()); + } + } + if (!lmm_get_number_of_cnst_from_var + (p_maxminSystem, action->getVariable())) { + /* There is actually no link used, hence an infinite bandwidth. + * This happens often when using models like vivaldi. + * In such case, just make sure that the action completes immediately. + */ + action->updateRemains(action->getRemains()); + } + action->updateRemains(lmm_variable_getvalue(action->getVariable()) * delta); + + if (action->getMaxDuration() != NO_MAX_DURATION) + action->updateMaxDuration(delta); + + if ((action->getRemains() <= 0) && + (lmm_get_variable_weight(action->getVariable()) > 0)) { + action->finish(); + action->setState(SURF_ACTION_DONE); + action->gapRemove(); + } else if (((action->getMaxDuration() != NO_MAX_DURATION) + && (action->getMaxDuration() <= 0))) { + action->finish(); + action->setState(SURF_ACTION_DONE); + action->gapRemove(); + } + } + return; +} + ActionPtr NetworkCm02Model::communicate(RoutingEdgePtr src, RoutingEdgePtr dst, double size, double rate) { @@ -541,6 +610,9 @@ void NetworkCm02Link::updateBandwidth(double value, double date){ (p_power.peak * p_power.scale); lmm_variable_t var = NULL; lmm_element_t elem = NULL; + lmm_element_t nextelem = NULL; + int numelem = 0; + NetworkCm02ActionPtr action = NULL; p_power.peak = value; @@ -548,11 +620,9 @@ void NetworkCm02Link::updateBandwidth(double value, double date){ getConstraint(), sg_bandwidth_factor * (p_power.peak * p_power.scale)); -#ifdef HAVE_TRACING TRACE_surf_link_set_bandwidth(date, getName(), sg_bandwidth_factor * p_power.peak * p_power.scale); -#endif if (sg_weight_S_parameter > 0) { - while ((var = lmm_get_var_from_cnst(getModel()->getMaxminSystem(), getConstraint(), &elem))) { + while ((var = lmm_get_var_from_cnst_safe(getModel()->getMaxminSystem(), getConstraint(), &elem, &nextelem, &numelem))) { action = (NetworkCm02ActionPtr) lmm_variable_id(var); action->m_weight += delta; if (!action->isSuspended()) @@ -565,10 +635,12 @@ void NetworkCm02Link::updateLatency(double value, double date){ double delta = value - m_latCurrent; lmm_variable_t var = NULL; lmm_element_t elem = NULL; + lmm_element_t nextelem = NULL; + int numelem = 0; NetworkCm02ActionPtr action = NULL; m_latCurrent = value; - while ((var = lmm_get_var_from_cnst(getModel()->getMaxminSystem(), getConstraint(), &elem))) { + while ((var = lmm_get_var_from_cnst_safe(getModel()->getMaxminSystem(), getConstraint(), &elem, &nextelem, &numelem))) { action = (NetworkCm02ActionPtr) lmm_variable_id(var); action->m_latCurrent += delta; action->m_weight += delta;