+static int complete_comm_pattern(xbt_dynar_t list, mc_comm_pattern_t pattern){
+ mc_comm_pattern_t current_pattern;
+ unsigned int cursor = 0;
+ xbt_dynar_foreach(list, cursor, current_pattern){
+ if(current_pattern->comm == pattern->comm){
+ if(!current_pattern->completed){
+ current_pattern->src_proc = pattern->comm->comm.src_proc->pid;
+ current_pattern->dst_proc = pattern->comm->comm.dst_proc->pid;
+ current_pattern->data_size = pattern->comm->comm.src_buff_size;
+ current_pattern->data = xbt_malloc0(current_pattern->data_size);
+ current_pattern->matched_comm = pattern->num;
+ memcpy(current_pattern->data, current_pattern->comm->comm.src_buff, current_pattern->data_size);
+ current_pattern->completed = 1;
+ return current_pattern->num;
+ }
+ }
+ }
+ return -1;
+}
+
+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->completed = 0;
+ if(call == 1){ // ISEND
+ pattern->comm = simcall_comm_isend__get__result(request);
+ pattern->type = SIMIX_COMM_SEND;
+ if(pattern->comm->comm.dst_proc != NULL){
+
+ pattern->matched_comm = complete_comm_pattern(list, pattern);
+ pattern->dst_proc = pattern->comm->comm.dst_proc->pid;
+ pattern->completed = 1;
+ }
+ pattern->src_proc = pattern->comm->comm.src_proc->pid;
+ pattern->data_size = pattern->comm->comm.src_buff_size;
+ pattern->data=xbt_malloc0(pattern->data_size);
+ 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;
+ if(pattern->comm->comm.src_proc != NULL){
+ pattern->matched_comm = complete_comm_pattern(list, pattern);
+ pattern->src_proc = pattern->comm->comm.src_proc->pid;
+ pattern->completed = 1;
+ pattern->data_size = pattern->comm->comm.src_buff_size;
+ pattern->data=xbt_malloc0(pattern->data_size);
+ memcpy(pattern->data, pattern->comm->comm.src_buff, pattern->data_size);
+ }
+ pattern->dst_proc = pattern->comm->comm.dst_proc->pid;
+ }
+ 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);
+}
+
+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){
+ // fprintf(stderr, "%s (%d - comm %p, src : %lu, dst %lu, rdv name %s, data %p, matched with %d)\n", current_comm->type == SIMIX_COMM_SEND ? "iSend" : "iRecv", current_comm->num, current_comm->comm, current_comm->src_proc, current_comm->dst_proc, current_comm->rdv, current_comm->data, current_comm->matched_comm);
+ }