X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=model.h;h=85101fee11931f581c1d8812737b0532d20b693b;hb=dbb1bb205f35f076cf2d82ec443415d858b22e2f;hp=d0043a1f88b1990de8e0fcdee27e21baa387ccd7;hpb=ffc110b3aaa80564dbf85f3c6a9049efd40571f1;p=model-checker.git diff --git a/model.h b/model.h index d0043a1..85101fe 100644 --- a/model.h +++ b/model.h @@ -23,6 +23,7 @@ class CycleGraph; class Promise; class Scheduler; class Thread; +struct model_snapshot_members; /** @brief Shorthand for a list of release sequence heads */ typedef std::vector< const ModelAction *, ModelAlloc > rel_heads_list_t; @@ -37,22 +38,20 @@ struct model_params { unsigned int fairwindow; unsigned int enabledcount; unsigned int bound; + + /** @brief Maximum number of future values that can be sent to the same + * read */ + int maxfuturevalues; + + /** @brief Only generate a new future value/expiration pair if the + * expiration time exceeds the existing one by more than the slop + * value */ + unsigned int expireslop; }; struct PendingFutureValue { ModelAction *writer; - ModelAction * act; -}; - -/** - * Structure for holding small ModelChecker members that should be snapshotted - */ -struct model_snapshot_members { - ModelAction *current_action; - unsigned int next_thread_id; - modelclock_t used_sequence_numbers; - Thread *nextThread; - ModelAction *next_backtrack; + ModelAction *act; }; /** @brief Records information regarding a single pending release sequence */ @@ -88,8 +87,11 @@ public: Thread * get_thread(thread_id_t tid) const; Thread * get_thread(ModelAction *act) const; + bool is_enabled(Thread *t) const; + bool is_enabled(thread_id_t tid) const; + thread_id_t get_next_id(); - unsigned int get_num_threads(); + unsigned int get_num_threads() const; Thread * get_current_thread(); int switch_to_master(ModelAction *act); @@ -99,19 +101,20 @@ public: bool isfeasible(); bool isfeasibleotherthanRMW(); bool isfinalfeasible(); + void check_promises_thread_disabled(); void mo_check_promises(thread_id_t tid, const ModelAction *write); void check_promises(thread_id_t tid, ClockVector *old_cv, ClockVector * merge_cv); void get_release_seq_heads(ModelAction *act, rel_heads_list_t *release_heads); void finish_execution(); bool isfeasibleprefix(); void set_assert() {asserted=true;} + bool is_deadlocked() const; /** @brief Alert the model-checker that an incorrectly-ordered * synchronization was made */ void set_bad_synchronization() { bad_synchronization = true; } const model_params params; - Scheduler * get_scheduler() { return scheduler;} Node * get_curr_node(); MEMALLOC @@ -131,15 +134,9 @@ private: void wake_up_sleeping_actions(ModelAction * curr); modelclock_t get_next_seq_num(); - /** - * Stores the ModelAction for the current thread action. Call this - * immediately before switching from user- to system-context to pass - * data between them. - * @param act The ModelAction created by the user-thread action - */ - void set_current_action(ModelAction *act) { priv->current_action = act; } + void set_current_action(ModelAction *act); Thread * check_current_action(ModelAction *curr); - ModelAction * initialize_curr_action(ModelAction *curr); + bool initialize_curr_action(ModelAction **curr); bool process_read(ModelAction *curr, bool second_part_of_rmw); bool process_write(ModelAction *curr); bool process_mutex(ModelAction *curr); @@ -181,17 +178,17 @@ private: /** Per-object list of actions. Maps an object (i.e., memory location) * to a trace of all actions performed on the object. */ - HashTable *obj_map; + HashTable *obj_map; /** Per-object list of actions. Maps an object (i.e., memory location) * to a trace of all actions performed on the object. */ - HashTable *lock_waiters_map; + HashTable *lock_waiters_map; /** Per-object list of actions. Maps an object (i.e., memory location) * to a trace of all actions performed on the object. */ - HashTable *condvar_waiters_map; + HashTable *condvar_waiters_map; - HashTable, uintptr_t, 4 > *obj_thrd_map; + HashTable *, uintptr_t, 4 > *obj_thrd_map; std::vector< Promise *, SnapshotAlloc > *promises; std::vector< struct PendingFutureValue, SnapshotAlloc > *futurevalues;