+static double generic_net_share_resources(double now)
+{
+ if(network_update_mechanism == UM_LAZY)
+ return im_net_share_resources(now);
+ else if (network_update_mechanism == UM_FULL)
+ {
+ return net_share_resources(now);
+ } else {
+ xbt_die("Invalide update mechanism!");
+ return 0;
+ }
+}
+
+static void net_update_actions_state(double now, double delta)
+{
+ double deltap = 0.0;
+ surf_action_network_CM02_im_t action = NULL;
+ surf_action_network_CM02_im_t next_action = NULL;
+ xbt_swag_t running_actions =
+ surf_network_model->states.running_action_set;
+ /*
+ xbt_swag_t failed_actions =
+ surf_network_model->states.failed_action_set;
+ */
+
+ xbt_swag_foreach_safe(action, next_action, running_actions) {
+ deltap = delta;
+ if (action->latency > 0) {
+ if (action->latency > deltap) {
+ double_update(&(action->latency), deltap);
+ deltap = 0.0;
+ } else {
+ double_update(&(deltap), action->latency);
+ action->latency = 0.0;
+ }
+ if ((action->latency == 0.0) && !(action->suspended))
+ lmm_update_variable_weight(network_im_maxmin_system, action->variable,
+ action->weight);
+ }
+#ifdef HAVE_TRACING
+ if (TRACE_is_enabled()) {
+ xbt_dynar_t route=NULL;
+ routing_get_route_and_latency(action->src_name, action->dst_name,&route,NULL);
+ link_CM02_im_t link;
+ unsigned int i;
+ xbt_dynar_foreach(route, i, link) {
+ TRACE_surf_link_set_utilization(link->lmm_resource.generic_resource.name,
+ action->generic_action.data,
+ (surf_action_t) action,
+ lmm_variable_getvalue
+ (action->variable), now - delta,
+ delta);
+ }
+ }
+#endif
+ if(!lmm_get_number_of_cnst_from_var(network_im_maxmin_system, action->variable)) {
+ /* 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.
+ */
+ double_update(&(action->generic_action.remains),
+ action->generic_action.remains);
+ }
+ double_update(&(action->generic_action.remains),
+ lmm_variable_getvalue(action->variable) * deltap);
+ if (action->generic_action.max_duration != NO_MAX_DURATION)
+ 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();
+ surf_network_model->action_state_set((surf_action_t) action,
+ SURF_ACTION_DONE);
+#ifdef HAVE_SMPI
+ gap_remove(action);
+#endif
+ } else if ((action->generic_action.max_duration != NO_MAX_DURATION)
+ && (action->generic_action.max_duration <= 0)) {
+ action->generic_action.finish = surf_get_clock();
+ surf_network_model->action_state_set((surf_action_t) action,
+ SURF_ACTION_DONE);
+#ifdef HAVE_SMPI
+ gap_remove(action);
+#endif
+ }
+ }
+
+ return;
+}
+