X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=history.h;h=803077693e6ef8edab7ddd0f2552a1e341502708;hp=441a999f46f2ab6cb6e7f1f4124ae1e90b156e77;hb=dc255d1dd25f734bc6b1aae2f39418381c0823b5;hpb=c44681494532fc9b3cec1e9148324025a635017b diff --git a/history.h b/history.h index 441a999f..80307769 100644 --- a/history.h +++ b/history.h @@ -1,39 +1,86 @@ -#include "stl-model.h" +#ifndef __HISTORY_H__ +#define __HISTORY_H__ + #include "common.h" +#include "classlist.h" #include "hashtable.h" -#include "modeltypes.h" - -/* forward declaration */ -class ModelAction; - -typedef ModelList action_mlist_t; +#include "threads-model.h" class ModelHistory { public: ModelHistory(); + ~ModelHistory(); void enter_function(const uint32_t func_id, thread_id_t tid); void exit_function(const uint32_t func_id, thread_id_t tid); - uint32_t get_func_counter() { return func_id; } - void incr_func_counter() { func_id++; } + uint32_t get_func_counter() { return func_counter; } + void incr_func_counter() { func_counter++; } + + void resize_func_nodes(uint32_t max_func_id); + void process_action(ModelAction *act, thread_id_t tid); + + HashTable * getFuncMap() { return &func_map; } + ModelVector * getFuncMapRev() { return &func_map_rev; } + + ModelVector * getFuncNodes() { return &func_nodes; } + FuncNode * get_func_node(uint32_t func_id); + FuncNode * get_curr_func_node(thread_id_t tid); + + void update_write_history(void * location, uint64_t write_val); + HashTable * getWriteHistory() { return write_history; } + void update_loc_rd_func_nodes_map(void * location, FuncNode * node); + void update_loc_wr_func_nodes_map(void * location, FuncNode * node); + SnapVector * getRdFuncNodes(void * location); + SnapVector * getWrFuncNodes(void * location); + + void add_waiting_write(ConcretePredicate * concrete); + void remove_waiting_write(thread_id_t tid); + void check_waiting_write(ModelAction * write_act); + SnapVector * getThrdWaitingWrite() { return thrd_waiting_write; } - HashTable * getFuncMap() { return &func_map; } - HashTable * getFuncHistory() { return &func_history; } + WaitObj * getWaitObj(thread_id_t tid); + void add_waiting_thread(thread_id_t self_id, thread_id_t waiting_for_id, int dist); + void remove_waiting_thread(thread_id_t self_id, thread_id_t waiting_for_id); - void print(); + SnapVector * getThrdInstActMap(uint32_t func_id); + void set_new_exec_flag(); + void dump_func_node_graph(); + void print_func_node(); + void print_waiting_threads(); + + MEMALLOC private: - uint32_t func_id; + uint32_t func_counter; + + /* Map function names to integer ids */ + HashTable func_map; + + /* Map integer ids to function names */ + ModelVector func_map_rev; + + ModelVector func_nodes; - /* map function names to integer ids */ - HashTable func_map; + /* Map a location to a set of values that have been written to it */ + HashTable * write_history; - HashTable func_history; + /* Map a location to FuncNodes that may read from it */ + HashTable *, uintptr_t, 0> * loc_rd_func_nodes_map; - /* work_list stores a list of function ids for each thread - * SnapList is intended to be used as a stack storing - * the functions that thread i has entered and yet to exit from - */ - HashTable *, uintptr_t, 4> work_list; + /* Map a location to FuncNodes that may write to it */ + HashTable *, uintptr_t, 0> * loc_wr_func_nodes_map; + + HashTable *, uintptr_t, 0> * loc_waiting_writes_map; + /* The write values each paused thread is waiting for */ + SnapVector * thrd_waiting_write; + SnapVector * thrd_wait_obj; + + /* A run-time map from FuncInst to ModelAction per each thread, per each FuncNode. + * Manipulated by FuncNode, and needed by NewFuzzer */ + HashTable *, int, 0> * func_inst_act_maps; + + bool skip_action(ModelAction * act, SnapList * curr_act_list); }; + +#endif /* __HISTORY_H__ */