#include "config.h"
#include "modeltypes.h"
#include "stl-model.h"
-#include "context.h"
#include "params.h"
/* Forward declaration */
/** @brief The central structure for model-checking */
class ModelExecution {
public:
- ModelExecution(struct model_params *params, Scheduler *scheduler, NodeStack *node_stack);
+ ModelExecution(ModelChecker *m,
+ const struct model_params *params,
+ Scheduler *scheduler,
+ NodeStack *node_stack);
~ModelExecution();
+ const struct model_params * get_params() const { return params; }
+
Thread * take_step(ModelAction *curr);
void fixup_release_sequences();
void check_promises_thread_disabled();
bool isfeasibleprefix() const;
- action_list_t * get_actions_on_obj(void * obj, thread_id_t tid);
+ action_list_t * get_actions_on_obj(void * obj, thread_id_t tid) const;
ModelAction * get_last_action(thread_id_t tid) const;
bool check_action_enabled(ModelAction *curr);
bool is_feasible_prefix_ignore_relseq() const;
bool is_infeasible() const;
bool is_deadlocked() const;
+ bool is_yieldblocked() const;
bool too_many_steps() const;
ModelAction * get_next_backtrack();
- action_list_t * get_action_trace() const { return action_trace; }
+ action_list_t * get_action_trace() { return &action_trace; }
- void increment_execution_number() { execution_number++; }
+ CycleGraph * const get_mo_graph() { return mo_graph; }
- MEMALLOC
+ SNAPSHOTALLOC
private:
+ int get_execution_number() const;
+
+ ModelChecker *model;
+
const model_params * const params;
/** The scheduler to use: tracks the running/ready Threads */
bool mo_may_allow(const ModelAction *writer, const ModelAction *reader);
bool promises_may_allow(const ModelAction *writer, const ModelAction *reader) const;
void set_bad_synchronization();
+ void set_bad_sc_read();
bool promises_expired() const;
bool should_wake_up(const ModelAction *curr, const Thread *thread) const;
void wake_up_sleeping_actions(ModelAction *curr);
ModelAction * check_current_action(ModelAction *curr);
bool initialize_curr_action(ModelAction **curr);
bool process_read(ModelAction *curr);
- bool process_write(ModelAction *curr);
+ bool process_write(ModelAction *curr, work_queue_t *work);
bool process_fence(ModelAction *curr);
bool process_mutex(ModelAction *curr);
bool process_thread_action(ModelAction *curr);
void set_backtracking(ModelAction *act);
bool set_latest_backtrack(ModelAction *act);
Promise * pop_promise_to_resolve(const ModelAction *curr);
- bool resolve_promise(ModelAction *curr, Promise *promise);
+ bool resolve_promise(ModelAction *curr, Promise *promise,
+ work_queue_t *work);
void compute_promises(ModelAction *curr);
void compute_relseq_breakwrites(ModelAction *curr);
bool w_modification_order(ModelAction *curr, ModelVector<ModelAction *> *send_fv);
void get_release_seq_heads(ModelAction *acquire, ModelAction *read, rel_heads_list_t *release_heads);
bool release_seq_heads(const ModelAction *rf, rel_heads_list_t *release_heads, struct release_seq *pending) const;
+ void propagate_clockvector(ModelAction *acquire, work_queue_t *work);
bool resolve_release_sequences(void *location, work_queue_t *work_queue);
void add_future_value(const ModelAction *writer, ModelAction *reader);
-
+ bool check_coherence_promise(const ModelAction *write, const ModelAction *read);
ModelAction * get_uninitialized_action(const ModelAction *curr) const;
- action_list_t * const action_trace;
- HashTable<int, Thread *, int> * const thread_map;
+ action_list_t action_trace;
+ SnapVector<Thread *> thread_map;
/** Per-object list of actions. Maps an object (i.e., memory location)
* to a trace of all actions performed on the object. */
- HashTable<const void *, action_list_t *, uintptr_t, 4> * const obj_map;
+ HashTable<const void *, action_list_t *, uintptr_t, 4> 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<const void *, action_list_t *, uintptr_t, 4> * const condvar_waiters_map;
+ HashTable<const void *, action_list_t *, uintptr_t, 4> condvar_waiters_map;
- HashTable<void *, SnapVector<action_list_t> *, uintptr_t, 4 > * const obj_thrd_map;
- SnapVector<Promise *> * const promises;
- SnapVector<struct PendingFutureValue> * const futurevalues;
+ HashTable<void *, SnapVector<action_list_t> *, uintptr_t, 4> obj_thrd_map;
+
+ /**
+ * @brief List of currently-pending promises
+ *
+ * Promises are sorted by the execution order of the read(s) which
+ * created them
+ */
+ SnapVector<Promise *> promises;
+ SnapVector<struct PendingFutureValue> futurevalues;
/**
* List of pending release sequences. Release sequences might be
* are established. Each entry in the list may only be partially
* filled, depending on its pending status.
*/
- SnapVector<struct release_seq *> * const pending_rel_seqs;
+ SnapVector<struct release_seq *> pending_rel_seqs;
- SnapVector<ModelAction *> * const thrd_last_action;
- SnapVector<ModelAction *> * const thrd_last_fence_release;
+ SnapVector<ModelAction *> thrd_last_action;
+ SnapVector<ModelAction *> thrd_last_fence_release;
NodeStack * const node_stack;
/** A special model-checker Thread; used for associating with
*/
CycleGraph * const mo_graph;
- int execution_number;
-
Thread * action_select_next_thread(const ModelAction *curr) const;
};