X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7e9b6e88f6c2daa87a9f5370596e5acc7f73fc6a..b1f526e4157e5a965b4773291c81fc71de27de25:/src/mc/mc_liveness.c diff --git a/src/mc/mc_liveness.c b/src/mc/mc_liveness.c index a49dbfbedc..82481dcde1 100644 --- a/src/mc/mc_liveness.c +++ b/src/mc/mc_liveness.c @@ -5,6 +5,7 @@ #include "mc_private.h" #include +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_liveness, mc, "Logging specific to algorithms for liveness properties verification"); @@ -33,110 +34,49 @@ unsigned int hash_region(char *str, int str_len){ } -int data_program_region_compare(void *d1, void *d2, size_t size){ - int distance = 0; - int i; - - for(i=0; inum_reg != s2->num_reg){ - XBT_INFO("Different num_reg (s1 = %u, s2 = %u)", s1->num_reg, s2->num_reg); - return 1; - } - - int i; - int errors = 0; - - for(i=0 ; i< s1->num_reg ; i++){ - - if(s1->regions[i]->type != s2->regions[i]->type){ - XBT_INFO("Different type of region"); - errors++; - } - - switch(s1->regions[i]->type){ - case 0: - if(s1->regions[i]->size != s2->regions[i]->size){ - XBT_INFO("Different size of heap (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size); - errors++; - } - if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){ - XBT_INFO("Different start addr of heap (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr); - errors++; - } - if(mmalloc_compare_heap(s1->regions[i]->data, s2->regions[i]->data)){ - XBT_INFO("Different heap (mmalloc_compare)"); - errors++; - } - break; - case 1 : - if(s1->regions[i]->size != s2->regions[i]->size){ - XBT_INFO("Different size of libsimgrid (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size); - errors++; - } - if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){ - XBT_INFO("Different start addr of libsimgrid (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr); - errors++; - } - if(data_libsimgrid_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){ - XBT_INFO("Different memcmp for data in libsimgrid"); - errors++; - } - break; - case 2 : - if(s1->regions[i]->size != s2->regions[i]->size){ - XBT_INFO("Different size of data program (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size); - errors++; - } - if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){ - XBT_INFO("Different start addr of data program (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr); - errors++; - } - if(data_program_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){ - XBT_INFO("Different memcmp for data in program"); - errors++; - } - break; - default: - break; + int status; + switch(fork()){ + case 0: + // We are the child process -- run the actual program + abort(); + break; + + case -1: + // An error occurred, shouldn't happen + perror("fork"); + return -1; + + default: + // We are the parent process -- wait for the child process to exit + if(wait(&status) < 0) + perror("wait"); + printf("child exited with status %d\n", status); + if(WIFSIGNALED(status) && WCOREDUMP(status)){ + printf("got a core dump\n"); + char *core_name = malloc(20); + sprintf(core_name,"core_%d", pair); + rename("core", core_name); + free(core_name); } } - return (errors > 0); - + return 0; } int reached(xbt_state_t st){ + raw_mem_set = (mmalloc_get_current_heap() == raw_heap); + if(xbt_dynar_is_empty(reached_pairs)){ @@ -156,7 +96,7 @@ int reached(xbt_state_t st){ /* Get values of propositional symbols */ unsigned int cursor = 0; xbt_propositional_symbol_t ps = NULL; - xbt_dynar_foreach(automaton->propositional_symbols, cursor, ps){ + xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, ps){ f = (int_f_void_t)ps->function; res = (*f)(); xbt_dynar_push_as(prop_ato, int, res); @@ -180,6 +120,12 @@ int reached(xbt_state_t st){ xbt_dynar_reset(prop_ato); xbt_free(prop_ato); MC_UNSET_RAW_MEM; + + if(raw_mem_set) + MC_SET_RAW_MEM; + else + MC_UNSET_RAW_MEM; + return 1; } /* } @@ -198,6 +144,12 @@ int reached(xbt_state_t st){ xbt_dynar_reset(prop_ato); xbt_free(prop_ato); MC_UNSET_RAW_MEM; + + if(raw_mem_set) + MC_SET_RAW_MEM; + else + MC_UNSET_RAW_MEM; + return 0; } @@ -366,6 +318,7 @@ int rdv_points_compare(xbt_dict_t d1, xbt_dict_t d2){ /* d1 = pair_test, d2 = cu void set_pair_reached(xbt_state_t st){ + raw_mem_set = (mmalloc_get_current_heap() == raw_heap); MC_SET_RAW_MEM; @@ -384,7 +337,7 @@ void set_pair_reached(xbt_state_t st){ int res; int_f_void_t f; - xbt_dynar_foreach(automaton->propositional_symbols, cursor, ps){ + xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, ps){ f = (int_f_void_t)ps->function; res = (*f)(); xbt_dynar_push_as(pair->prop_ato, int, res); @@ -417,12 +370,20 @@ void set_pair_reached(xbt_state_t st){ xbt_dynar_push(reached_pairs, &pair); MC_UNSET_RAW_MEM; - + + if(raw_mem_set) + MC_SET_RAW_MEM; + else + MC_UNSET_RAW_MEM; + + create_dump(xbt_dynar_length(reached_pairs)); + } int reached_hash(xbt_state_t st){ + raw_mem_set = (mmalloc_get_current_heap() == raw_heap); if(xbt_dynar_is_empty(reached_pairs_hash)){ @@ -449,7 +410,7 @@ int reached_hash(xbt_state_t st){ int res; int_f_void_t f; - xbt_dynar_foreach(automaton->propositional_symbols, cursor, ps){ + xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, ps){ f = (int_f_void_t)ps->function; res = (*f)(); xbt_dynar_push_as(prop_ato, int, res); @@ -475,6 +436,12 @@ int reached_hash(xbt_state_t st){ xbt_dynar_reset(prop_ato); xbt_free(prop_ato); MC_UNSET_RAW_MEM; + + if(raw_mem_set) + MC_SET_RAW_MEM; + else + MC_UNSET_RAW_MEM; + return 1; }else{ XBT_INFO("Different snapshot"); @@ -493,12 +460,20 @@ int reached_hash(xbt_state_t st){ xbt_dynar_reset(prop_ato); xbt_free(prop_ato); MC_UNSET_RAW_MEM; + + if(raw_mem_set) + MC_SET_RAW_MEM; + else + MC_UNSET_RAW_MEM; + return 0; } } void set_pair_reached_hash(xbt_state_t st){ + + raw_mem_set = (mmalloc_get_current_heap() == raw_heap); MC_SET_RAW_MEM; @@ -523,7 +498,7 @@ void set_pair_reached_hash(xbt_state_t st){ int res; int_f_void_t f; - xbt_dynar_foreach(automaton->propositional_symbols, cursor, ps){ + xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, ps){ f = (int_f_void_t)ps->function; res = (*f)(); xbt_dynar_push_as(pair->prop_ato, int, res); @@ -534,12 +509,18 @@ void set_pair_reached_hash(xbt_state_t st){ MC_free_snapshot(sn); MC_UNSET_RAW_MEM; - + + if(raw_mem_set) + MC_SET_RAW_MEM; + else + MC_UNSET_RAW_MEM; + } int visited(xbt_state_t st, int sc){ + raw_mem_set = (mmalloc_get_current_heap() == raw_heap); if(xbt_dynar_is_empty(visited_pairs)){ @@ -560,7 +541,7 @@ int visited(xbt_state_t st, int sc){ int res; int_f_void_t f; - xbt_dynar_foreach(automaton->propositional_symbols, cursor, ps){ + xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, ps){ f = (int_f_void_t)ps->function; res = (*f)(); xbt_dynar_push_as(prop_ato, int, res); @@ -580,6 +561,11 @@ int visited(xbt_state_t st, int sc){ xbt_free(prop_ato); MC_UNSET_RAW_MEM; + if(raw_mem_set) + MC_SET_RAW_MEM; + else + MC_UNSET_RAW_MEM; + return 1; }else{ @@ -601,6 +587,12 @@ int visited(xbt_state_t st, int sc){ xbt_dynar_reset(prop_ato); xbt_free(prop_ato); MC_UNSET_RAW_MEM; + + if(raw_mem_set) + MC_SET_RAW_MEM; + else + MC_UNSET_RAW_MEM; + return 0; } @@ -609,6 +601,7 @@ int visited(xbt_state_t st, int sc){ int visited_hash(xbt_state_t st, int sc){ + raw_mem_set = (mmalloc_get_current_heap() == raw_heap); if(xbt_dynar_is_empty(visited_pairs_hash)){ @@ -635,7 +628,7 @@ int visited_hash(xbt_state_t st, int sc){ int res; int_f_void_t f; - xbt_dynar_foreach(automaton->propositional_symbols, cursor, ps){ + xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, ps){ f = (int_f_void_t)ps->function; res = (*f)(); xbt_dynar_push_as(prop_ato, int, res); @@ -661,6 +654,12 @@ int visited_hash(xbt_state_t st, int sc){ xbt_dynar_reset(prop_ato); xbt_free(prop_ato); MC_UNSET_RAW_MEM; + + if(raw_mem_set) + MC_SET_RAW_MEM; + else + MC_UNSET_RAW_MEM; + return 1; }else{ //XBT_INFO("Different snapshot"); @@ -682,12 +681,20 @@ int visited_hash(xbt_state_t st, int sc){ xbt_dynar_reset(prop_ato); xbt_free(prop_ato); MC_UNSET_RAW_MEM; + + if(raw_mem_set) + MC_SET_RAW_MEM; + else + MC_UNSET_RAW_MEM; + return 0; } } void set_pair_visited_hash(xbt_state_t st, int sc){ + + raw_mem_set = (mmalloc_get_current_heap() == raw_heap); MC_SET_RAW_MEM; @@ -713,7 +720,7 @@ void set_pair_visited_hash(xbt_state_t st, int sc){ int res; int_f_void_t f; - xbt_dynar_foreach(automaton->propositional_symbols, cursor, ps){ + xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, ps){ f = (int_f_void_t)ps->function; res = (*f)(); xbt_dynar_push_as(pair->prop_ato, int, res); @@ -725,10 +732,16 @@ void set_pair_visited_hash(xbt_state_t st, int sc){ MC_UNSET_RAW_MEM; + if(raw_mem_set) + MC_SET_RAW_MEM; + else + MC_UNSET_RAW_MEM; + } void set_pair_visited(xbt_state_t st, int sc){ + raw_mem_set = (mmalloc_get_current_heap() == raw_heap); MC_SET_RAW_MEM; @@ -747,7 +760,7 @@ void set_pair_visited(xbt_state_t st, int sc){ int res; int_f_void_t f; - xbt_dynar_foreach(automaton->propositional_symbols, cursor, ps){ + xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, ps){ f = (int_f_void_t)ps->function; res = (*f)(); xbt_dynar_push_as(pair->prop_ato, int, res); @@ -757,6 +770,10 @@ void set_pair_visited(xbt_state_t st, int sc){ MC_UNSET_RAW_MEM; + if(raw_mem_set) + MC_SET_RAW_MEM; + else + MC_UNSET_RAW_MEM; } @@ -789,7 +806,7 @@ int MC_automaton_evaluate_label(xbt_exp_label_t l){ unsigned int cursor = 0; xbt_propositional_symbol_t p = NULL; int_f_void_t f; - xbt_dynar_foreach(automaton->propositional_symbols, cursor, p){ + xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, p){ if(strcmp(p->pred, l->u.predicat) == 0){ f = (int_f_void_t)p->function; return (*f)(); @@ -826,6 +843,8 @@ mc_pair_stateless_t new_pair_stateless(mc_state_t sg, xbt_state_t st, int r){ void MC_ddfs_init(void){ + raw_mem_set = (mmalloc_get_current_heap() == raw_heap); + XBT_INFO("**************************************************"); XBT_INFO("Double-DFS init"); XBT_INFO("**************************************************"); @@ -849,7 +868,7 @@ void MC_ddfs_init(void){ reached_pairs = xbt_dynar_new(sizeof(mc_pair_reached_t), NULL); //reached_pairs_hash = xbt_dynar_new(sizeof(mc_pair_reached_hash_t), NULL); //visited_pairs = xbt_dynar_new(sizeof(mc_pair_visited_t), NULL); - visited_pairs_hash = xbt_dynar_new(sizeof(mc_pair_visited_hash_t), NULL); + //visited_pairs_hash = xbt_dynar_new(sizeof(mc_pair_visited_hash_t), NULL); successors = xbt_dynar_new(sizeof(mc_pair_stateless_t), NULL); /* Save the initial state */ @@ -861,7 +880,7 @@ void MC_ddfs_init(void){ unsigned int cursor = 0; xbt_state_t state; - xbt_dynar_foreach(automaton->states, cursor, state){ + xbt_dynar_foreach(_mc_property_automaton->states, cursor, state){ if(state->type == -1){ MC_SET_RAW_MEM; @@ -896,13 +915,21 @@ void MC_ddfs_init(void){ } } - } + } + + if(raw_mem_set) + MC_SET_RAW_MEM; + else + MC_UNSET_RAW_MEM; + } void MC_ddfs(int search_cycle){ + raw_mem_set = (mmalloc_get_current_heap() == raw_heap); + smx_process_t process; mc_pair_stateless_t current_pair = NULL; @@ -914,7 +941,7 @@ void MC_ddfs(int search_cycle){ current_pair = (mc_pair_stateless_t)xbt_fifo_get_item_content(xbt_fifo_get_first_item(mc_stack_liveness)); /* Update current state in buchi automaton */ - automaton->current_state = current_pair->automaton_state; + _mc_property_automaton->current_state = current_pair->automaton_state; XBT_INFO("********************* ( Depth = %d, search_cycle = %d )", xbt_fifo_size(mc_stack_liveness), search_cycle); @@ -939,10 +966,10 @@ void MC_ddfs(int search_cycle){ if(xbt_fifo_size(mc_stack_liveness) < MAX_DEPTH_LIVENESS){ //set_pair_visited(current_pair->automaton_state, search_cycle); - set_pair_visited_hash(current_pair->automaton_state, search_cycle); + //set_pair_visited_hash(current_pair->automaton_state, search_cycle); //XBT_INFO("Visited pairs : %lu", xbt_dynar_length(visited_pairs)); - XBT_INFO("Visited pairs : %lu", xbt_dynar_length(visited_pairs_hash)); + //XBT_INFO("Visited pairs : %lu", xbt_dynar_length(visited_pairs_hash)); if(current_pair->requests > 0){ @@ -1051,7 +1078,7 @@ void MC_ddfs(int search_cycle){ }else{ - if(!visited_hash(pair_succ->automaton_state, search_cycle)){ + //if(!visited_hash(pair_succ->automaton_state, search_cycle)){ //if(!visited(pair_succ->automaton_state, search_cycle)){ MC_SET_RAW_MEM; @@ -1060,11 +1087,11 @@ void MC_ddfs(int search_cycle){ MC_ddfs(search_cycle); - }else{ + /*}else{ XBT_INFO("Next pair already visited ! "); - } + }*/ } @@ -1084,7 +1111,7 @@ void MC_ddfs(int search_cycle){ } - if(!visited_hash(pair_succ->automaton_state, search_cycle)){ + //if(!visited_hash(pair_succ->automaton_state, search_cycle)){ //if(!visited(pair_succ->automaton_state, search_cycle)){ MC_SET_RAW_MEM; @@ -1093,11 +1120,11 @@ void MC_ddfs(int search_cycle){ MC_ddfs(search_cycle); - }else{ + /*}else{ XBT_INFO("Next pair already visited ! "); - } + }*/ } @@ -1199,7 +1226,7 @@ void MC_ddfs(int search_cycle){ }else{ - if(!visited_hash(pair_succ->automaton_state, search_cycle)){ + //if(!visited_hash(pair_succ->automaton_state, search_cycle)){ //if(!visited(pair_succ->automaton_state, search_cycle)){ MC_SET_RAW_MEM; @@ -1208,11 +1235,11 @@ void MC_ddfs(int search_cycle){ MC_ddfs(search_cycle); - }else{ + /*}else{ XBT_INFO("Next pair already visited ! "); - } + }*/ } @@ -1230,7 +1257,7 @@ void MC_ddfs(int search_cycle){ } - if(!visited_hash(pair_succ->automaton_state, search_cycle)){ + //if(!visited_hash(pair_succ->automaton_state, search_cycle)){ //if(!visited(pair_succ->automaton_state, search_cycle)){ MC_SET_RAW_MEM; @@ -1239,11 +1266,11 @@ void MC_ddfs(int search_cycle){ MC_ddfs(search_cycle); - }else{ + /*}else{ XBT_INFO("Next pair already visited ! "); - } + }*/ } @@ -1276,64 +1303,10 @@ void MC_ddfs(int search_cycle){ //xbt_dynar_pop(reached_pairs_hash, NULL); } MC_UNSET_RAW_MEM; - - - -} - - -#ifdef SIMGRID_TEST - -XBT_TEST_SUITE("mc_liveness", "Model checking liveness properties"); -XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(mc_liveness); - -XBT_TEST_UNIT("snapshots_comparison", test_compare_snapshot, "Comparison of snapshots") -{ - - MC_SET_RAW_MEM; - - /* Save first snapshot */ - mc_snapshot_t snapshot1 = xbt_new0(s_mc_snapshot_t, 1); - MC_take_snapshot_liveness(snapshot1); - - /* Save second snapshot */ - mc_snapshot_t snapshot2 = xbt_new0(s_mc_snapshot_t, 1); - MC_take_snapshot_liveness(snapshot2); - - MC_UNSET_RAW_MEM; - - xbt_test_assert(snapshot_compare(snapshot1, snapshot2) == 0, "Different consecutive snapshot"); - - -} - -XBT_TEST_UNIT("snapshots_comparison2", test2_compare_snapshot, "Comparison of snapshots with modification between") -{ - - MC_SET_RAW_MEM; - - /* Save first snapshot */ - mc_snapshot_t snapshot1 = xbt_new0(s_mc_snapshot_t, 1); - MC_take_snapshot_liveness(snapshot1); - - MC_UNSET_RAW_MEM; - void *test = snapshot1; - test = (char*)test+1; - char* t= strdup("toto"); - t=strdup("tat"); - - MC_SET_RAW_MEM; - - /* Save second snapshot */ - mc_snapshot_t snapshot2 = xbt_new0(s_mc_snapshot_t, 1); - MC_take_snapshot_liveness(snapshot2); - - xbt_test_assert(snapshot_compare(snapshot1, snapshot2) != 0, "Same snapshot with new allocations"); - - MC_UNSET_RAW_MEM; - + if(raw_mem_set) + MC_SET_RAW_MEM; + else + MC_UNSET_RAW_MEM; } - -#endif