-static void comm_pattern_free(mc_comm_pattern_t p){
- xbt_free(p->rdv);
- xbt_free(p->data);
- xbt_free(p);
- p = NULL;
-}
-
-static void comm_pattern_free_voidp( void *p){
- comm_pattern_free((mc_comm_pattern_t) * (void **)p);
-}
-
-static mc_comm_pattern_t get_comm_pattern_from_idx(xbt_dynar_t pattern, unsigned int *idx, e_smx_comm_type_t type, unsigned long proc){
- mc_comm_pattern_t current_comm;
- while(*idx < xbt_dynar_length(pattern)){
- current_comm = (mc_comm_pattern_t)xbt_dynar_get_as(pattern, *idx, mc_comm_pattern_t);
- if(current_comm->type == type && type == SIMIX_COMM_SEND){
- if(current_comm->src_proc == proc)
- return current_comm;
- }else if(current_comm->type == type && type == SIMIX_COMM_RECEIVE){
- if(current_comm->dst_proc == proc)
- return current_comm;
- }
- (*idx)++;
- }
- return NULL;
-}
-
-static int compare_comm_pattern(mc_comm_pattern_t comm1, mc_comm_pattern_t comm2){
- if(strcmp(comm1->rdv, comm2->rdv) != 0)
- return 1;
- if(comm1->src_proc != comm2->src_proc)
- return 1;
- if(comm1->dst_proc != comm2->dst_proc)
- return 1;
- if(comm1->data_size != comm2->data_size)
- return 1;
- if(memcmp(comm1->data, comm2->data, comm1->data_size) != 0)
- return 1;
- return 0;
-}
-
-static void deterministic_pattern(xbt_dynar_t initial_pattern, xbt_dynar_t pattern){
- unsigned int cursor = 0, send_index = 0, recv_index = 0;
- mc_comm_pattern_t comm1, comm2;
- int comm_comparison = 0;
- int current_process = 0;
- while(current_process < simix_process_maxpid){
- while(cursor < xbt_dynar_length(initial_pattern)){
- comm1 = (mc_comm_pattern_t)xbt_dynar_get_as(initial_pattern, cursor, mc_comm_pattern_t);
- if(comm1->type == SIMIX_COMM_SEND && comm1->src_proc == current_process){
- comm2 = get_comm_pattern_from_idx(pattern, &send_index, comm1->type, current_process);
- comm_comparison = compare_comm_pattern(comm1, comm2);
- if(comm_comparison == 1){
- initial_state_safety->send_deterministic = 0;
- initial_state_safety->comm_deterministic = 0;
- return;
- }
- send_index++;
- }else if(comm1->type == SIMIX_COMM_RECEIVE && comm1->dst_proc == current_process){
- comm2 = get_comm_pattern_from_idx(pattern, &recv_index, comm1->type, current_process);
- comm_comparison = compare_comm_pattern(comm1, comm2);
- if(comm_comparison == 1){
- initial_state_safety->comm_deterministic = 0;
- }
- recv_index++;
- }
- cursor++;
- }
- cursor = 0;
- send_index = 0;
- recv_index = 0;
- current_process++;
- }
- // XBT_DEBUG("Communication-deterministic : %d, Send-deterministic : %d", initial_state_safety->comm_deterministic, initial_state_safety->send_deterministic);
-}
-
-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);
- }
-}