HashTable<pthread_mutex_t *, cdsc::snapmutex *, uintptr_t, 4> * getMutexMap() {return &mutex_map;}
ModelAction * check_current_action(ModelAction *curr);
- SnapVector<func_id_list_t> * get_thrd_func_list() { return &thrd_func_list; }
- SnapVector<uint32_t> * get_thrd_last_entered_func() { return &thrd_last_entered_func; }
- SnapVector< SnapList<action_list_t *> *> * get_thrd_func_act_lists() { return &thrd_func_act_lists; }
bool isFinished() {return isfinished;}
void setFinished() {isfinished = true;}
Thread * action_select_next_thread(const ModelAction *curr) const;
bool paused_by_fuzzer(const ModelAction * act) const;
- /* thrd_func_list stores a list of function ids for each thread.
- * Each element in thrd_func_list stores the functions that
- * thread i has entered and yet to exit from
- *
- * This data structure is handled by ModelHistory
- */
- SnapVector<func_id_list_t> thrd_func_list;
- SnapVector<uint32_t> thrd_last_entered_func;
-
- /* Keeps track of atomic actions that thread i has performed in some
- * function. Index of SnapVector is thread id. SnapList simulates
- * the call stack.
- */
- SnapVector< SnapList<action_list_t *> *> thrd_func_act_lists;
bool isfinished;
};
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);
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 );
/* @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();
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 )
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) {
HashTable<void *, SnapVector<FuncNode *> *, uintptr_t, 0> * loc_wr_func_nodes_map;
HashTable<void *, SnapVector<ConcretePredicate *> *, uintptr_t, 0> * loc_waiting_writes_map;
+
+ /* Keeps track of atomic actions that thread i has performed in some
+ * function. Index of SnapVector is thread id. SnapList simulates
+ * the call stack.
+ */
+ SnapVector< SnapList<action_list_t *> *> * thrd_func_act_lists;
+
+ /* thrd_func_list stores a list of function ids for each thread.
+ * Each element in thrd_func_list stores the functions that
+ * thread i has entered and yet to exit from
+ */
+ SnapVector<func_id_list_t> * thrd_func_list;
+ SnapVector<uint32_t> * thrd_last_entered_func;
+
/* The write values each paused thread is waiting for */
SnapVector<ConcretePredicate *> * thrd_waiting_write;
SnapVector<WaitObj *> * thrd_wait_obj;
bool skip_action(ModelAction * act, SnapList<ModelAction *> * curr_act_list);
void monitor_waiting_thread(uint32_t func_id, thread_id_t tid);
void monitor_waiting_thread_counter(thread_id_t tid);
+
};
#endif /* __HISTORY_H__ */