Makefile: rename variable to be more clear
[model-checker.git] / model.cc
index 6120f4d4d688d908fb66c47b848b3db472c9081b..83c79c97ffc654818df100c04ebbf5efa8c244a6 100644 (file)
--- a/model.cc
+++ b/model.cc
@@ -286,8 +286,7 @@ void ModelChecker::execute_sleep_set() {
        for(unsigned int i=0;i<get_num_threads();i++) {
                thread_id_t tid=int_to_id(i);
                Thread *thr=get_thread(tid);
-               if ( scheduler->get_enabled(thr) == THREAD_SLEEP_SET &&
-                                thr->get_pending() == NULL ) {
+               if (scheduler->is_sleep_set(thr) && thr->get_pending() == NULL) {
                        thr->set_state(THREAD_RUNNING);
                        scheduler->next_thread(thr);
                        Thread::swap(&system_context, thr);
@@ -298,16 +297,15 @@ void ModelChecker::execute_sleep_set() {
        priv->current_action = NULL;
 }
 
-void ModelChecker::wake_up_sleeping_actions(ModelAction * curr) {
-       for(unsigned int i=0;i<get_num_threads();i++) {
-               thread_id_t tid=int_to_id(i);
-               Thread *thr=get_thread(tid);
-               if ( scheduler->get_enabled(thr) == THREAD_SLEEP_SET ) {
-                       ModelAction *pending_act=thr->get_pending();
-                       if ((!curr->is_rmwr())&&pending_act->could_synchronize_with(curr)) {
+void ModelChecker::wake_up_sleeping_actions(ModelAction *curr)
+{
+       for (unsigned int i = 0; i < get_num_threads(); i++) {
+               Thread *thr = get_thread(int_to_id(i));
+               if (scheduler->is_sleep_set(thr)) {
+                       ModelAction *pending_act = thr->get_pending();
+                       if ((!curr->is_rmwr()) && pending_act->could_synchronize_with(curr))
                                //Remove this thread from sleep set
                                scheduler->remove_sleep(thr);
-                       }
                }
        }
 }
@@ -879,6 +877,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 +897,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 +1515,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 +1706,7 @@ bool ModelChecker::w_modification_order(ModelAction *curr)
                                        *act < *last_sc_fence_thread_before) {
                                mo_graph->addEdge(act, curr);
                                added = true;
+                               break;
                        }
 
                        /*