priv->bad_synchronization = true;
}
+/**
+ * Check whether the current trace has triggered an assertion which should halt
+ * its execution.
+ *
+ * @return True, if the execution should be aborted; false otherwise
+ */
bool ModelChecker::has_asserted() const
{
return priv->asserted;
}
+/**
+ * Trigger a trace assertion which should cause this execution to be halted.
+ * This can be due to a detected bug or due to an infeasibility that should
+ * halt ASAP.
+ */
void ModelChecker::set_assert()
{
priv->asserted = true;
add_thread(t);
do {
+ /*
+ * Stash next pending action(s) for thread(s). There
+ * should only need to stash one thread's action--the
+ * thread which just took a step--plus the first step
+ * for any newly-created thread
+ */
for (unsigned int i = 0; i < get_num_threads(); i++) {
thread_id_t tid = int_to_id(i);
Thread *thr = get_thread(tid);
return wait_list[i];
}
+ /** @return The pending (next) ModelAction for this Thread
+ * @see Thread::pending */
ModelAction * get_pending() const { return pending; }
+
+ /** @brief Set the pending (next) ModelAction for this Thread
+ * @param act The pending ModelAction
+ * @see Thread::pending */
void set_pending(ModelAction *act) { pending = act; }
+
/**
* Remove one ModelAction from the waiting list
* @return The ModelAction that was removed from the waiting list
*/
private:
int create_context();
+
+ /** @brief The parent Thread which created this Thread */
Thread *parent;
+
+ /** @brief The THREAD_CREATE ModelAction which created this Thread */
ModelAction *creation;
+ /**
+ * @brief The next ModelAction to be run by this Thread
+ *
+ * This action should be kept updated by the ModelChecker, so that we
+ * always know what the next ModelAction's memory_order, action type,
+ * and location are.
+ */
ModelAction *pending;
+
void (*start_routine)(void *);
void *arg;
ucontext_t context;