-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);
- }
-}
-
-static void visited_state_free(mc_visited_state_t state){
- if(state){