+xbt_dict_t gap_lookup = NULL;
+
+static double net_get_link_bandwidth(const void *link);
+
+static void 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 gap_remove(surf_action_network_CM02_t action) {
+ xbt_fifo_t fifo;
+ size_t size;
+
+ if(sg_sender_gap > 0.0) {
+ 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_size(gap_lookup);
+ if(size == 0) {
+ xbt_dict_free(&gap_lookup);
+ }
+ }
+ }
+}