model: add PendingFutureValue constructor
[model-checker.git] / model.cc
index c9bb86824233723fc706ba2ae8b407f14a5c8895..bc17a882c56f38c7bab1a71064f584ca285e6171 100644 (file)
--- a/model.cc
+++ b/model.cc
@@ -159,7 +159,7 @@ void ModelChecker::reset_to_initial_state()
        /* Print all model-checker output before rollback */
        fflush(model_out);
 
-       snapshotObject->backTrackBeforeStep(0);
+       snapshot_backtrack_before(0);
 }
 
 /** @return a thread ID for a new Thread */
@@ -174,7 +174,12 @@ unsigned int ModelChecker::get_num_threads() const
        return priv->next_thread_id;
 }
 
-/** @return The currently executing Thread. */
+/**
+ * Must be called from user-thread context (e.g., through the global
+ * thread_current() interface)
+ *
+ * @return The currently executing Thread.
+ */
 Thread * ModelChecker::get_current_thread() const
 {
        return scheduler->get_current_thread();
@@ -212,9 +217,8 @@ Thread * ModelChecker::get_next_thread(ModelAction *curr)
                /* Do not split atomic actions. */
                if (curr->is_rmwr())
                        return thread_current();
-               /* The THREAD_CREATE action points to the created Thread */
                else if (curr->get_type() == THREAD_CREATE)
-                       return (Thread *)curr->get_location();
+                       return curr->get_thread_operand();
        }
 
        /* Have we completed exploring the preselected path? */
@@ -820,7 +824,7 @@ bool ModelChecker::process_mutex(ModelAction *curr)
                if (curr->get_node()->get_misc() == 0) {
                        get_safe_ptr_action(condvar_waiters_map, curr->get_location())->push_back(curr);
                        //disable us
-                       scheduler->sleep(get_current_thread());
+                       scheduler->sleep(get_thread(curr));
                }
                break;
        }
@@ -867,7 +871,7 @@ bool ModelChecker::process_write(ModelAction *curr)
                                        pfv.act->get_node()->add_future_value(pfv.writer->get_value(), pfv.writer->get_seq_number() + params.maxfuturedelay))
                                set_latest_backtrack(pfv.act);
                }
-               futurevalues->resize(0);
+               futurevalues->clear();
        }
 
        mo_graph->commitChanges();
@@ -944,12 +948,12 @@ bool ModelChecker::process_thread_action(ModelAction *curr)
 
        switch (curr->get_type()) {
        case THREAD_CREATE: {
-               Thread *th = (Thread *)curr->get_location();
+               Thread *th = curr->get_thread_operand();
                th->set_creation(curr);
                break;
        }
        case THREAD_JOIN: {
-               Thread *blocking = (Thread *)curr->get_location();
+               Thread *blocking = curr->get_thread_operand();
                ModelAction *act = get_last_action(blocking->get_id());
                curr->synchronize_with(act);
                updated = true; /* trigger rel-seq checks */
@@ -1203,8 +1207,8 @@ ModelAction * ModelChecker::check_current_action(ModelAction *curr)
        if (!check_action_enabled(curr)) {
                /* Make the execution look like we chose to run this action
                 * much later, when a lock/join can succeed */
-               get_current_thread()->set_pending(curr);
-               scheduler->sleep(get_current_thread());
+               get_thread(curr)->set_pending(curr);
+               scheduler->sleep(get_thread(curr));
                return NULL;
        }
 
@@ -1769,8 +1773,7 @@ bool ModelChecker::w_modification_order(ModelAction *curr)
                                if (thin_air_constraint_may_allow(curr, act)) {
                                        if (!is_infeasible() ||
                                                        (curr->is_rmw() && act->is_rmw() && curr->get_reads_from() == act->get_reads_from() && !is_infeasible_ignoreRMW())) {
-                                               struct PendingFutureValue pfv = {curr, act};
-                                               futurevalues->push_back(pfv);
+                                               futurevalues->push_back(PendingFutureValue(curr, act));
                                        }
                                }
                        }