modelclock_t used_sequence_numbers;
Thread *nextThread;
ModelAction *next_backtrack;
-
- /** @see ModelChecker::lazy_sync_size */
- unsigned int lazy_sync_size;
};
/** @brief The central structure for model-checking */
void finish_execution();
bool isfeasibleprefix();
void set_assert() {asserted=true;}
+
+ /** @brief Alert the model-checker that an incorrectly-ordered
+ * synchronization was made */
+ void set_bad_synchronization() { bad_synchronization = true; }
+
const model_params params;
MEMALLOC
ModelAction * initialize_curr_action(ModelAction *curr);
bool process_read(ModelAction *curr, bool second_part_of_rmw);
bool process_write(ModelAction *curr);
- void process_mutex(ModelAction *curr);
+ bool process_mutex(ModelAction *curr);
+ bool process_thread_action(ModelAction *curr);
bool check_action_enabled(ModelAction *curr);
bool take_step();
- void check_recency(ModelAction *curr);
+ void check_recency(ModelAction *curr, const ModelAction *rf);
ModelAction * get_last_conflict(ModelAction *act);
void set_backtracking(ModelAction *act);
Thread * get_next_thread(ModelAction *curr);
std::vector<struct PendingFutureValue> *futurevalues;
/**
- * Collection of lists of objects that might synchronize with one or
- * more release sequence. Release sequences might be determined lazily
- * as promises are fulfilled and modification orders are established.
- * This structure maps its lists by object location. Each ModelAction
- * in the lists should be an acquire operation.
- */
- HashTable<void *, action_list_t, uintptr_t, 4> *lazy_sync_with_release;
-
- /**
- * Represents the total size of the
- * ModelChecker::lazy_sync_with_release lists. This count should be
- * snapshotted, so it is actually a pointer to a location within
- * ModelChecker::priv
+ * List of acquire actions that might synchronize with one or more
+ * release sequence. Release sequences might be determined lazily as
+ * promises are fulfilled and modification orders are established. Each
+ * ModelAction in this list must be an acquire operation.
*/
- unsigned int *lazy_sync_size;
+ std::vector<ModelAction *> *pending_acq_rel_seq;
std::vector<ModelAction *> *thrd_last_action;
NodeStack *node_stack;
bool failed_promise;
bool too_many_reads;
bool asserted;
+ /** @brief Incorrectly-ordered synchronization was made */
+ bool bad_synchronization;
};
extern ModelChecker *model;