+ for(i=0 ; i< s1->num_reg ; i++){
+
+ if(s1->regions[i]->type != s2->regions[i]->type){
+ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+ XBT_DEBUG("Different type of region");
+ errors++;
+ }else{
+ return 1;
+ }
+ }
+
+ switch(s1->regions[i]->type){
+ case 0:
+ if(s1->regions[i]->size != s2->regions[i]->size){
+ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+ XBT_DEBUG("Different size of heap (s1 = %Zu, s2 = %Zu)", s1->regions[i]->size, s2->regions[i]->size);
+ errors++;
+ }else{
+ return 1;
+ }
+ }
+ if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
+ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+ XBT_DEBUG("Different start addr of heap (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
+ errors++;
+ }else{
+ return 1;
+ }
+ }
+ if(mmalloc_compare_heap(s1->regions[i]->data, s2->regions[i]->data)){
+ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+ XBT_DEBUG("Different heap (mmalloc_compare)");
+ errors++;
+ }else{
+ return 1;
+ }
+ }
+ break;
+ case 1 :
+ if(s1->regions[i]->size != s2->regions[i]->size){
+ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+ XBT_DEBUG("Different size of libsimgrid (s1 = %Zu, s2 = %Zu)", s1->regions[i]->size, s2->regions[i]->size);
+ errors++;
+ }else{
+ return 1;
+ }
+ }
+ if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
+ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+ XBT_DEBUG("Different start addr of libsimgrid (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
+ errors++;
+ }else{
+ return 1;
+ }
+ }
+ if(memcmp(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
+ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+ XBT_DEBUG("Different memcmp for data in libsimgrid");
+ errors++;
+ }else{
+ return 1;
+ }
+ }
+ break;
+ /*case 2:
+ if(s1->regions[i]->size != s2->regions[i]->size){
+ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+ XBT_DEBUG("Different size of program (s1 = %Zu, s2 = %Zu)", s1->regions[i]->size, s2->regions[i]->size);
+ errors++;
+ }else{
+ return 1;
+ }
+ }
+ if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
+ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+ XBT_DEBUG("Different start addr of program (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
+ errors++;
+ }else{
+ return 1;
+ }
+ }
+ if(memcmp(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
+ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+ XBT_DEBUG("Different memcmp for data in program");
+ errors++;
+ }else{
+ return 1;
+ }
+ }
+ break;*/
+ case 3:
+ if(s1->regions[i]->size != s2->regions[i]->size){
+ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+ XBT_DEBUG("Different size of stack (s1 = %Zu, s2 = %Zu)", s1->regions[i]->size, s2->regions[i]->size);
+ errors++;
+ }else{
+ return 1;
+ }
+ }
+ if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
+ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+ XBT_DEBUG("Different start addr of stack (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
+ errors++;
+ }else{
+ return 1;
+ }
+ }
+ if(memcmp(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
+ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+ XBT_DEBUG("Different memcmp for data in stack");
+ errors++;
+ }else{
+ return 1;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+ return (errors>0);
+ }else{
+ return 0;
+ }
+
+}
+
+int reached(xbt_state_t st){
+
+
+ if(xbt_dynar_is_empty(reached_pairs)){
+
+ return 0;
+
+ }else{
+
+ MC_SET_RAW_MEM;
+
+ mc_snapshot_t sn = xbt_new0(s_mc_snapshot_t, 1);
+ MC_take_snapshot_liveness(sn);
+
+ xbt_dynar_t prop_ato = xbt_dynar_new(sizeof(int), NULL);
+ int res;
+ int (*f)();
+
+ /* Get values of propositional symbols */
+ unsigned int cursor = 0;
+ xbt_propositional_symbol_t ps = NULL;
+ xbt_dynar_foreach(automaton->propositional_symbols, cursor, ps){
+ f = ps->function;
+ res = (*f)();
+ xbt_dynar_push_as(prop_ato, int, res);
+ }
+
+ cursor = 0;
+ mc_pair_reached_t pair_test = NULL;
+
+
+ xbt_dynar_foreach(reached_pairs, cursor, pair_test){
+ if(automaton_state_compare(pair_test->automaton_state, st) == 0){
+ if(propositional_symbols_compare_value(pair_test->prop_ato, prop_ato) == 0){
+ XBT_DEBUG("Pair reached %d", cursor+1);
+ if(snapshot_compare(pair_test->system_state, sn) == 0){
+ MC_free_snapshot(sn);
+ xbt_dynar_reset(prop_ato);
+ xbt_free(prop_ato);
+ MC_UNSET_RAW_MEM;
+ return 1;
+ }
+ }
+ }