notes: fence: add release/acquire fence notes
[c11tester.git] / model.cc
index 6120f4d4d688d908fb66c47b848b3db472c9081b..715a2584f36a1538528489d60f987142ad0f2a77 100644 (file)
--- a/model.cc
+++ b/model.cc
@@ -879,6 +879,8 @@ bool ModelChecker::process_fence(ModelAction *curr)
                /* Find X : is_read(X) && X --sb-> curr */
                for (rit = list->rbegin(); rit != list->rend(); rit++) {
                        ModelAction *act = *rit;
+                       if (act == curr)
+                               continue;
                        if (act->get_tid() != curr->get_tid())
                                continue;
                        /* Stop at the beginning of the thread */
@@ -897,7 +899,7 @@ bool ModelChecker::process_fence(ModelAction *curr)
                        rel_heads_list_t release_heads;
                        get_release_seq_heads(curr, act, &release_heads);
                        for (unsigned int i = 0; i < release_heads.size(); i++)
-                               if (!act->synchronize_with(release_heads[i]))
+                               if (!curr->synchronize_with(release_heads[i]))
                                        set_bad_synchronization();
                        if (release_heads.size() != 0)
                                updated = true;
@@ -1515,18 +1517,21 @@ bool ModelChecker::r_modification_order(ModelAction *curr, const ModelAction *rf
                                                *act < *last_sc_fence_thread_local) {
                                        mo_graph->addEdge(act, rf);
                                        added = true;
+                                       break;
                                }
                                /* C++, Section 29.3 statement 4 */
                                else if (act->is_seqcst() && last_sc_fence_local &&
                                                *act < *last_sc_fence_local) {
                                        mo_graph->addEdge(act, rf);
                                        added = true;
+                                       break;
                                }
                                /* C++, Section 29.3 statement 6 */
                                else if (last_sc_fence_thread_before &&
                                                *act < *last_sc_fence_thread_before) {
                                        mo_graph->addEdge(act, rf);
                                        added = true;
+                                       break;
                                }
                        }
 
@@ -1703,6 +1708,7 @@ bool ModelChecker::w_modification_order(ModelAction *curr)
                                        *act < *last_sc_fence_thread_before) {
                                mo_graph->addEdge(act, curr);
                                added = true;
+                               break;
                        }
 
                        /*