+ "Logging specific to MC DPOR exploration");
+
+xbt_dynar_t visited_states;
+
+static int is_visited_state(void);
+
+static int is_visited_state(){
+
+ if(_surf_mc_visited == 0)
+ return 0;
+
+ int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+
+ MC_SET_RAW_MEM;
+
+ mc_snapshot_t new_state = NULL;
+ new_state = MC_take_snapshot();
+
+ MC_UNSET_RAW_MEM;
+
+ if(xbt_dynar_is_empty(visited_states)){
+
+ MC_SET_RAW_MEM;
+ xbt_dynar_push(visited_states, &new_state);
+ MC_UNSET_RAW_MEM;
+
+ if(raw_mem_set)
+ MC_SET_RAW_MEM;
+
+ return 0;
+
+ }else{
+
+ MC_SET_RAW_MEM;
+
+ unsigned int cursor = 0;
+ mc_snapshot_t state_test = NULL;
+
+ xbt_dynar_foreach(visited_states, cursor, state_test){
+ if(XBT_LOG_ISENABLED(mc_dpor, xbt_log_priority_debug))
+ XBT_DEBUG("****** Pair visited #%d ******", cursor + 1);
+ if(snapshot_compare(new_state, state_test, NULL, NULL) == 0){
+ if(raw_mem_set)
+ MC_SET_RAW_MEM;
+ else
+ MC_UNSET_RAW_MEM;
+
+ return 1;
+ }
+ }
+
+ if(xbt_dynar_length(visited_states) == _surf_mc_visited){
+ mc_snapshot_t state_to_remove = NULL;
+ xbt_dynar_shift(visited_states, &state_to_remove);
+ MC_free_snapshot(state_to_remove);
+ }
+
+ xbt_dynar_push(visited_states, &new_state);
+
+ MC_UNSET_RAW_MEM;
+
+ if(raw_mem_set)
+ MC_SET_RAW_MEM;
+
+ return 0;
+
+ }
+}