class ModelExecution {
public:
ModelExecution(ModelChecker *m,
- struct model_params *params,
+ const struct model_params *params,
Scheduler *scheduler,
NodeStack *node_stack);
~ModelExecution();
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();
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);
HashTable<const void *, action_list_t *, uintptr_t, 4> condvar_waiters_map;
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;