-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;
- if(!_sg_mc_send_determinism)
- return;
- }
- recv_index++;
- }
- cursor++;
- }
- cursor = 0;
- send_index = 0;
- recv_index = 0;
- current_process++;
- }
-}
-
-static int complete_comm_pattern(xbt_dynar_t list, mc_comm_pattern_t pattern){
- mc_comm_pattern_t current_pattern;
- unsigned int cursor = 0;
- int index;
- 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 == pattern->comm){
- current_pattern->src_proc = pattern->comm->comm.src_proc->pid;
- current_pattern->dst_proc = pattern->comm->comm.dst_proc->pid;
- current_pattern->src_host = simcall_host_get_name(pattern->comm->comm.src_proc->smx_host);
- current_pattern->dst_host = simcall_host_get_name(pattern->comm->comm.dst_proc->smx_host);
- if(current_pattern->data_size == -1){
- current_pattern->data_size = pattern->comm->comm.src_buff_size;
- current_pattern->data = xbt_malloc0(current_pattern->data_size);
- memcpy(current_pattern->data, current_pattern->comm->comm.src_buff, current_pattern->data_size);
- }
- current_pattern->matched_comm = pattern->num;
- current_pattern->completed = 1;
- xbt_dynar_remove_at(incomplete_communications_pattern, cursor, NULL);
- 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;
- pattern->data_size = -1;
- 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->dst_host = simcall_host_get_name(pattern->comm->comm.dst_proc->smx_host);
- pattern->completed = 1;
- }
- 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);
- 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->src_host = simcall_host_get_name(request->issuer->smx_host);
- 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;
- 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);
-
- if(!pattern->completed)
- 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 -> %s] %s ", current_comm->src_proc, current_comm->src_host, current_comm->dst_host, "iSend");
- else
- XBT_INFO("[(%lu) %s <- %s] %s ", current_comm->dst_proc, current_comm->dst_host, current_comm->src_host, "iRecv");
- }
-}
-
-static void visited_state_free(mc_visited_state_t state){
- if(state){