+
+ if (network_update_mechanism == UM_LAZY) {
+ xbt_heap_free(net_action_heap);
+ xbt_swag_free(net_modified_set);
+ }
+
+ if (smpi_bw_factor)
+ xbt_dynar_free(&smpi_bw_factor);
+ if (smpi_lat_factor)
+ xbt_dynar_free(&smpi_lat_factor);
+}
+
+static void smpi_gap_append(double size, const link_CM02_t link,
+ surf_action_network_CM02_t action)
+{
+ const char *src = link->lmm_resource.generic_resource.name;
+ xbt_fifo_t fifo;
+ surf_action_network_CM02_t last_action;
+ double bw;
+
+ if (sg_sender_gap > 0.0) {
+ if (!gap_lookup) {
+ gap_lookup = xbt_dict_new();
+ }
+ fifo = (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup, src);
+ action->sender.gap = 0.0;
+ if (fifo && xbt_fifo_size(fifo) > 0) {
+ /* Compute gap from last send */
+ last_action =
+ (surf_action_network_CM02_t)
+ xbt_fifo_get_item_content(xbt_fifo_get_last_item(fifo));
+ bw = net_get_link_bandwidth(link);
+ action->sender.gap =
+ last_action->sender.gap + max(sg_sender_gap,
+ last_action->sender.size / bw);
+ action->latency += action->sender.gap;
+ }
+ /* Append action as last send */
+ action->sender.link_name = link->lmm_resource.generic_resource.name;
+ fifo =
+ (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup,
+ action->sender.link_name);
+ if (!fifo) {
+ fifo = xbt_fifo_new();
+ xbt_dict_set(gap_lookup, action->sender.link_name, fifo, NULL);
+ }
+ action->sender.fifo_item = xbt_fifo_push(fifo, action);
+ action->sender.size = size;
+ }
+}
+
+static void smpi_gap_remove(surf_action_network_CM02_t action)
+{
+ xbt_fifo_t fifo;
+ size_t size;
+
+ if (sg_sender_gap > 0.0 && action->sender.link_name
+ && action->sender.fifo_item) {
+ fifo =
+ (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup,
+ action->sender.link_name);
+ xbt_fifo_remove_item(fifo, action->sender.fifo_item);
+ size = xbt_fifo_size(fifo);
+ if (size == 0) {
+ xbt_fifo_free(fifo);
+ xbt_dict_remove(gap_lookup, action->sender.link_name);
+ size = xbt_dict_length(gap_lookup);
+ if (size == 0) {
+ xbt_dict_free(&gap_lookup);
+ }
+ }
+ }