+void complete_comm_pattern(xbt_dynar_t list, smx_action_t comm){
+ mc_comm_pattern_t current_pattern;
+ unsigned int cursor = 0;
+ int index;
+ int completed = 0;
+ void *addr_pointed;
+ xbt_dynar_foreach(incomplete_communications_pattern, cursor, index){
+ current_pattern = (mc_comm_pattern_t)xbt_dynar_get_as(list, index, mc_comm_pattern_t);
+ if(current_pattern->comm == comm){
+ current_pattern->src_proc = comm->comm.src_proc->pid;
+ current_pattern->dst_proc = comm->comm.dst_proc->pid;
+ current_pattern->src_host = simcall_host_get_name(comm->comm.src_proc->smx_host);
+ current_pattern->dst_host = simcall_host_get_name(comm->comm.dst_proc->smx_host);
+ if(current_pattern->data_size == -1){
+ current_pattern->data_size = *(comm->comm.dst_buff_size);
+ current_pattern->data = xbt_malloc0(current_pattern->data_size);
+ addr_pointed = *(void **)comm->comm.src_buff;
+ if(addr_pointed > std_heap && addr_pointed < ((xbt_mheap_t)std_heap)->breakval)
+ memcpy(current_pattern->data, addr_pointed, current_pattern->data_size);
+ else
+ memcpy(current_pattern->data, comm->comm.src_buff, current_pattern->data_size);
+ }
+ xbt_dynar_remove_at(incomplete_communications_pattern, cursor, NULL);
+ completed++;
+ if(completed == 2)
+ return;
+ cursor--;
+ }
+ }
+}
+
+void get_comm_pattern(xbt_dynar_t list, smx_simcall_t request, int call){
+ mc_comm_pattern_t pattern = NULL;
+ pattern = xbt_new0(s_mc_comm_pattern_t, 1);
+ pattern->num = ++nb_comm_pattern;
+ pattern->data_size = -1;
+ void * addr_pointed;
+ if(call == 1){ // ISEND
+ pattern->comm = simcall_comm_isend__get__result(request);
+ pattern->type = SIMIX_COMM_SEND;
+ pattern->src_proc = pattern->comm->comm.src_proc->pid;
+ pattern->src_host = simcall_host_get_name(request->issuer->smx_host);
+ pattern->data_size = pattern->comm->comm.src_buff_size;
+ pattern->data = xbt_malloc0(pattern->data_size);
+ addr_pointed = *(void **)pattern->comm->comm.src_buff;
+ if(addr_pointed > std_heap && addr_pointed < ((xbt_mheap_t)std_heap)->breakval)
+ memcpy(pattern->data, addr_pointed, pattern->data_size);
+ else
+ memcpy(pattern->data, pattern->comm->comm.src_buff, pattern->data_size);
+ }else{ // IRECV
+ pattern->comm = simcall_comm_irecv__get__result(request);
+ pattern->type = SIMIX_COMM_RECEIVE;
+ pattern->dst_proc = pattern->comm->comm.dst_proc->pid;
+ pattern->dst_host = simcall_host_get_name(pattern->comm->comm.dst_proc->smx_host);
+ }
+
+ if(pattern->comm->comm.rdv != NULL)
+ pattern->rdv = strdup(pattern->comm->comm.rdv->name);
+ else
+ pattern->rdv = strdup(pattern->comm->comm.rdv_cpy->name);
+
+ xbt_dynar_push(list, &pattern);
+
+ xbt_dynar_push_as(incomplete_communications_pattern, int, xbt_dynar_length(list) - 1);
+
+}
+
+static void print_communications_pattern(xbt_dynar_t comms_pattern){
+ unsigned int cursor = 0;
+ mc_comm_pattern_t current_comm;
+ xbt_dynar_foreach(comms_pattern, cursor, current_comm){
+ if(current_comm->type == SIMIX_COMM_SEND)
+ XBT_INFO("[(%lu) %s -> (%lu) %s] %s ", current_comm->src_proc, current_comm->src_host, current_comm->dst_proc, current_comm->dst_host, "iSend");
+ else
+ XBT_INFO("[(%lu) %s <- (%lu) %s] %s ", current_comm->dst_proc, current_comm->dst_host, current_comm->src_proc, current_comm->src_host, "iRecv");
+ }
+}