X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/49e85177c669d793e84242983a1b1f430e47184e..e0d012a5fe6be526b6062eb17bbe23cc71771f84:/src/surf/network_cm02.cpp diff --git a/src/surf/network_cm02.cpp b/src/surf/network_cm02.cpp index b80ddfd255..73bc407998 100644 --- a/src/surf/network_cm02.cpp +++ b/src/surf/network_cm02.cpp @@ -315,7 +315,7 @@ void NetworkCm02Model::updateActionsStateLazy(double now, double /*delta*/) { NetworkCm02ActionPtr action; while ((xbt_heap_size(p_actionHeap) > 0) - && (double_equals(xbt_heap_maxkey(p_actionHeap), now))) { + && (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 @@ -482,6 +482,7 @@ ActionPtr NetworkCm02Model::communicate(RoutingEdgePtr src, RoutingEdgePtr dst, xbt_dynar_free(&route); XBT_OUT(); + surf_callback_emit(networkCommunicateCallbacks, action, src, dst, size, rate); return action; } @@ -530,59 +531,11 @@ void NetworkCm02Link::updateState(tmgr_trace_event_t event_type, /* value, event_type); */ if (event_type == p_power.event) { - double delta = - sg_weight_S_parameter / value - sg_weight_S_parameter / - (p_power.peak * p_power.scale); - lmm_variable_t var = NULL; - lmm_element_t elem = NULL; - NetworkCm02ActionPtr action = NULL; - - p_power.peak = value; - lmm_update_constraint_bound(getModel()->getMaxminSystem(), - 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))) { - action = (NetworkCm02ActionPtr) lmm_variable_id(var); - action->m_weight += delta; - if (!action->isSuspended()) - lmm_update_variable_weight(getModel()->getMaxminSystem(), action->getVariable(), action->m_weight); - } - } + updateBandwidth(value, date); if (tmgr_trace_event_free(event_type)) p_power.event = NULL; } else if (event_type == p_latEvent) { - double delta = value - m_latCurrent; - lmm_variable_t var = NULL; - lmm_element_t elem = NULL; - NetworkCm02ActionPtr action = NULL; - - m_latCurrent = value; - while ((var = lmm_get_var_from_cnst(getModel()->getMaxminSystem(), getConstraint(), &elem))) { - action = (NetworkCm02ActionPtr) lmm_variable_id(var); - action->m_latCurrent += delta; - action->m_weight += delta; - if (action->m_rate < 0) - lmm_update_variable_bound(getModel()->getMaxminSystem(), action->getVariable(), sg_tcp_gamma / (2.0 * action->m_latCurrent)); - else { - lmm_update_variable_bound(getModel()->getMaxminSystem(), action->getVariable(), - min(action->m_rate, sg_tcp_gamma / (2.0 * action->m_latCurrent))); - - if (action->m_rate < sg_tcp_gamma / (2.0 * action->m_latCurrent)) { - XBT_INFO("Flow is limited BYBANDWIDTH"); - } else { - XBT_INFO("Flow is limited BYLATENCY, latency of flow is %f", - action->m_latCurrent); - } - } - if (!action->isSuspended()) - lmm_update_variable_weight(getModel()->getMaxminSystem(), action->getVariable(), action->m_weight); - - } + updateLatency(value, date); if (tmgr_trace_event_free(event_type)) p_latEvent = NULL; } else if (event_type == p_stateEvent) { @@ -617,6 +570,60 @@ void NetworkCm02Link::updateState(tmgr_trace_event_t event_type, return; } +void NetworkCm02Link::updateBandwidth(double value, double date){ + double delta = sg_weight_S_parameter / value - sg_weight_S_parameter / + (p_power.peak * p_power.scale); + lmm_variable_t var = NULL; + lmm_element_t elem = NULL; + NetworkCm02ActionPtr action = NULL; + + p_power.peak = value; + lmm_update_constraint_bound(getModel()->getMaxminSystem(), + 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))) { + action = (NetworkCm02ActionPtr) lmm_variable_id(var); + action->m_weight += delta; + if (!action->isSuspended()) + lmm_update_variable_weight(getModel()->getMaxminSystem(), action->getVariable(), action->m_weight); + } + } +} + +void NetworkCm02Link::updateLatency(double value, double date){ + double delta = value - m_latCurrent; + lmm_variable_t var = NULL; + lmm_element_t elem = NULL; + NetworkCm02ActionPtr action = NULL; + + m_latCurrent = value; + while ((var = lmm_get_var_from_cnst(getModel()->getMaxminSystem(), getConstraint(), &elem))) { + action = (NetworkCm02ActionPtr) lmm_variable_id(var); + action->m_latCurrent += delta; + action->m_weight += delta; + if (action->m_rate < 0) + lmm_update_variable_bound(getModel()->getMaxminSystem(), action->getVariable(), sg_tcp_gamma / (2.0 * action->m_latCurrent)); + else { + lmm_update_variable_bound(getModel()->getMaxminSystem(), action->getVariable(), + min(action->m_rate, sg_tcp_gamma / (2.0 * action->m_latCurrent))); + + if (action->m_rate < sg_tcp_gamma / (2.0 * action->m_latCurrent)) { + XBT_INFO("Flow is limited BYBANDWIDTH"); + } else { + XBT_INFO("Flow is limited BYLATENCY, latency of flow is %f", + action->m_latCurrent); + } + } + if (!action->isSuspended()) + lmm_update_variable_weight(getModel()->getMaxminSystem(), action->getVariable(), action->m_weight); + } +} + /********** * Action * **********/ @@ -631,13 +638,13 @@ void NetworkCm02Action::updateRemainingLazy(double now) if (m_remains > 0) { XBT_DEBUG("Updating action(%p): remains was %f, last_update was: %f", this, m_remains, m_lastUpdate); - double_update(&(m_remains), m_lastValue * delta); + double_update(&(m_remains), m_lastValue * delta, sg_maxmin_precision*sg_surf_precision); XBT_DEBUG("Updating action(%p): remains is now %f", this, m_remains); } if (m_maxDuration != NO_MAX_DURATION) - double_update(&m_maxDuration, delta); + double_update(&m_maxDuration, delta, sg_surf_precision); if (m_remains <= 0 && (lmm_get_variable_weight(getVariable()) > 0)) {