add thread choosing in switch func
[c11tester.git] / history.cc
index 03515b537547301daf08dbcac423dbc40ff1e0b8..c15bb26fff72241bde7bd64ea0dcb87fcac091c7 100644 (file)
@@ -23,6 +23,9 @@ ModelHistory::ModelHistory() :
        loc_rd_func_nodes_map = new HashTable<void *, SnapVector<FuncNode *> *, uintptr_t, 0>();
        loc_wr_func_nodes_map = new HashTable<void *, SnapVector<FuncNode *> *, uintptr_t, 0>();
        loc_waiting_writes_map = new HashTable<void *, SnapVector<ConcretePredicate *> *, uintptr_t, 0>();
+       thrd_func_act_lists = new SnapVector< SnapList<action_list_t *> *>();
+       thrd_func_list = new SnapVector<func_id_list_t>();
+       thrd_last_entered_func = new SnapVector<uint32_t>();
        thrd_waiting_write = new SnapVector<ConcretePredicate *>();
        thrd_wait_obj = new SnapVector<WaitObj *>();
        func_inst_act_maps = new HashTable<uint32_t, SnapVector<inst_act_map_t *> *, 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<func_id_list_t> * thrd_func_list = execution->get_thrd_func_list();
-       SnapVector< SnapList<action_list_t *> *> *
-               thrd_func_act_lists = execution->get_thrd_func_act_lists();
-       SnapVector<uint32_t> * 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 );
@@ -88,11 +85,7 @@ void ModelHistory::enter_function(const uint32_t func_id, thread_id_t 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<func_id_list_t> * thrd_func_list = execution->get_thrd_func_list();
-       SnapVector< SnapList<action_list_t *> *> *
-               thrd_func_act_lists = execution->get_thrd_func_act_lists();
 
        SnapList<action_list_t *> * func_act_lists = (*thrd_func_act_lists)[id];
        uint32_t last_func_id = (*thrd_func_list)[id].back();
@@ -147,11 +140,6 @@ 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<func_id_list_t> * thrd_func_list = execution->get_thrd_func_list();
-       SnapVector< SnapList<action_list_t *> *> *
-               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 )
@@ -202,7 +190,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 +200,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 +223,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<func_id_list_t> * 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 +363,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 +410,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 +431,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 +504,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 +533,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 +572,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());