X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=history.cc;h=d5179332a36e8e489a73b5248921d8535cd74a01;hp=03515b537547301daf08dbcac423dbc40ff1e0b8;hb=fbed9b2aaf6ac4f928a59dd0dd885348dcb0eb4c;hpb=ca293a527c74c31998a55e447e1e72244ec2a2f5 diff --git a/history.cc b/history.cc index 03515b53..d5179332 100644 --- a/history.cc +++ b/history.cc @@ -23,6 +23,9 @@ ModelHistory::ModelHistory() : loc_rd_func_nodes_map = new HashTable *, uintptr_t, 0>(); loc_wr_func_nodes_map = new HashTable *, uintptr_t, 0>(); loc_waiting_writes_map = new HashTable *, uintptr_t, 0>(); + thrd_func_act_lists = new SnapVector< SnapList *>(); + thrd_func_list = new SnapVector(); + thrd_last_entered_func = new SnapVector(); thrd_waiting_write = new SnapVector(); thrd_wait_obj = new SnapVector(); func_inst_act_maps = new HashTable *, int, 0>(128); @@ -38,14 +41,8 @@ ModelHistory::~ModelHistory() void ModelHistory::enter_function(const uint32_t func_id, thread_id_t tid) { //model_print("thread %d entering func %d\n", tid, func_id); - ModelExecution * execution = model->get_execution(); uint id = id_to_int(tid); - SnapVector * thrd_func_list = execution->get_thrd_func_list(); - SnapVector< SnapList *> * - thrd_func_act_lists = execution->get_thrd_func_act_lists(); - SnapVector * thrd_last_entered_func = execution->get_thrd_last_entered_func(); - if ( thrd_func_list->size() <= id ) { uint oldsize = thrd_func_list->size(); thrd_func_list->resize( id + 1 ); @@ -82,17 +79,13 @@ void ModelHistory::enter_function(const uint32_t func_id, thread_id_t tid) } /* Monitor the statuses of threads waiting for tid */ - monitor_waiting_thread(func_id, tid); + // monitor_waiting_thread(func_id, tid); } /* @param func_id a non-zero value */ void ModelHistory::exit_function(const uint32_t func_id, thread_id_t tid) { - ModelExecution * execution = model->get_execution(); uint32_t id = id_to_int(tid); - SnapVector * thrd_func_list = execution->get_thrd_func_list(); - SnapVector< SnapList *> * - thrd_func_act_lists = execution->get_thrd_func_act_lists(); SnapList * func_act_lists = (*thrd_func_act_lists)[id]; uint32_t last_func_id = (*thrd_func_list)[id].back(); @@ -147,18 +140,13 @@ void ModelHistory::resize_func_nodes(uint32_t new_size) void ModelHistory::process_action(ModelAction *act, thread_id_t tid) { - ModelExecution * execution = model->get_execution(); - SnapVector * thrd_func_list = execution->get_thrd_func_list(); - SnapVector< SnapList *> * - thrd_func_act_lists = execution->get_thrd_func_act_lists(); - uint32_t thread_id = id_to_int(tid); /* Return if thread tid has not entered any function that contains atomics */ if ( thrd_func_list->size() <= thread_id ) return; /* Monitor the statuses of threads waiting for tid */ - monitor_waiting_thread_counter(tid); + // monitor_waiting_thread_counter(tid); /* Every write action should be processed, including * nonatomic writes (which have no position) */ @@ -193,7 +181,16 @@ void ModelHistory::process_action(ModelAction *act, thread_id_t tid) return; /* Add to curr_inst_list */ - curr_act_list->push_back(act); + act->setFuncActRef(curr_act_list->add_back(act)); + if (act->is_read()) { + ModelAction * rf = act->get_reads_from(); + void * func_act_ref = rf->getFuncActRef(); + if (func_act_ref == WRITE_REFERENCED) { + // do nothing + } else if (func_act_ref == NULL) { + rf->setFuncActRef(WRITE_REFERENCED); + } + } FuncNode * func_node = func_nodes[func_id]; func_node->add_inst(act); @@ -202,7 +199,7 @@ void ModelHistory::process_action(ModelAction *act, thread_id_t tid) func_node->update_inst_act_map(tid, act); Fuzzer * fuzzer = model->get_execution()->getFuzzer(); - Predicate * selected_branch = fuzzer->get_selected_child_branch(tid); + Predicate * selected_branch = ((NewFuzzer *)fuzzer)->get_selected_child_branch(tid); func_node->set_predicate_tree_position(tid, selected_branch); } @@ -212,7 +209,7 @@ void ModelHistory::process_action(ModelAction *act, thread_id_t tid) if (curr_pred) { // Follow child - curr_pred = curr_pred->get_single_child(curr_inst); + curr_pred = curr_pred->follow_write_child(curr_inst); } func_node->set_predicate_tree_position(tid, curr_pred); } @@ -235,7 +232,6 @@ FuncNode * ModelHistory::get_func_node(uint32_t func_id) FuncNode * ModelHistory::get_curr_func_node(thread_id_t tid) { int thread_id = id_to_int(tid); - SnapVector * thrd_func_list = model->get_execution()->get_thrd_func_list(); uint32_t func_id = (*thrd_func_list)[thread_id].back(); if (func_id != 0) { @@ -376,7 +372,7 @@ void ModelHistory::check_waiting_write(ModelAction * write_act) Thread * thread = model->get_thread(tid); //model_print("** thread %d is woken up\n", thread->get_id()); - model->get_execution()->getFuzzer()->notify_paused_thread(thread); + ((NewFuzzer *)model->get_execution()->getFuzzer())->notify_paused_thread(thread); } index++; @@ -423,6 +419,7 @@ void ModelHistory::remove_waiting_thread(thread_id_t tid) } self_wait_obj->clear_waiting_for(); + delete iter; } void ModelHistory::stop_waiting_for_node(thread_id_t self_id, @@ -443,7 +440,7 @@ void ModelHistory::stop_waiting_for_node(thread_id_t self_id, // model_print("\tthread %d waits for nobody, wake up\n", self_id); ModelExecution * execution = model->get_execution(); Thread * thread = execution->get_thread(self_id); - execution->getFuzzer()->notify_paused_thread(thread); + ((NewFuzzer *)execution->getFuzzer())->notify_paused_thread(thread); } } } @@ -516,7 +513,11 @@ void ModelHistory::monitor_waiting_thread(uint32_t func_id, thread_id_t tid) stop_waiting_for_node(waited_by_id, tid, target); } } + + delete node_iter; } + + delete tid_iter; } void ModelHistory::monitor_waiting_thread_counter(thread_id_t tid) @@ -541,10 +542,12 @@ void ModelHistory::monitor_waiting_thread_counter(thread_id_t tid) // model_print("\tthread %d waits for nobody, wake up\n", self_id); ModelExecution * execution = model->get_execution(); Thread * thread = execution->get_thread(waited_by_id); - execution->getFuzzer()->notify_paused_thread(thread); + ((NewFuzzer *)execution->getFuzzer())->notify_paused_thread(thread); } } } + + delete tid_iter; } /* Reallocate some snapshotted memories when new executions start */ @@ -578,8 +581,8 @@ void ModelHistory::print_func_node() /* function id starts with 1 */ for (uint32_t i = 1;i < func_nodes.size();i++) { FuncNode * func_node = func_nodes[i]; - func_node->print_predicate_tree(); + /* func_inst_list_mt * entry_insts = func_node->get_entry_insts(); model_print("function %s has entry actions\n", func_node->get_func_name());