model: add todo synchronization comment
[c11tester.git] / model.cc
index 8e3af8a37c13836ac466055ed039ebeea9cbf6b3..8267377faa791a2cfbc85f9027949c7338186635 100644 (file)
--- a/model.cc
+++ b/model.cc
@@ -576,6 +576,16 @@ void ModelChecker::process_relseq_fixup(ModelAction *curr, work_queue_t *work_qu
        ASSERT(release->same_thread(rf));
 
        if (write == NULL) {
+               /**
+                * @todo Forcing a synchronization requires that we set
+                * modification order constraints. For instance, we can't allow
+                * a fixup sequence in which two separate read-acquire
+                * operations read from the same sequence, where the first one
+                * synchronizes and the other doesn't. Essentially, we can't
+                * allow any writes to insert themselves between 'release' and
+                * 'rf'
+                */
+
                /* Must synchronize */
                if (!acquire->synchronize_with(release)) {
                        set_bad_synchronization();
@@ -602,6 +612,10 @@ void ModelChecker::process_relseq_fixup(ModelAction *curr, work_queue_t *work_qu
                mo_graph->addEdge(release, write);
                mo_graph->addEdge(write, rf);
        }
+
+       /* See if we have realized a data race */
+       if (checkDataRaces())
+               set_assert();
 }
 
 /**
@@ -1973,9 +1987,17 @@ bool ModelChecker::take_step() {
        DEBUG("(%d, %d)\n", curr ? id_to_int(curr->get_id()) : -1,
                        next ? id_to_int(next->get_id()) : -1);
 
-       /* When no more threads, or when execution replay chooses the
-        * 'model_thread': launch end-of-execution release sequence fixups */
-       if (!pending_rel_seqs->empty() && (!next || next->is_model_thread())) {
+       /*
+        * Launch end-of-execution release sequence fixups only when there are:
+        *
+        * (1) no more user threads to run (or when execution replay chooses
+        *     the 'model_thread')
+        * (2) pending release sequences
+        * (3) pending assertions (i.e., data races)
+        * (4) no pending promises
+        */
+       if (!pending_rel_seqs->empty() && (!next || next->is_model_thread()) &&
+                       isfinalfeasible() && !unrealizedraces.empty()) {
                printf("*** WARNING: release sequence fixup action (%zu pending release seuqences) ***\n",
                                pending_rel_seqs->size());
                ModelAction *fixup = new ModelAction(MODEL_FIXUP_RELSEQ,