Bug fix
[c11tester.git] / execution.cc
index 4e4a6bb28e9b8a1d885ddd78fd4023cec6893c2b..54e14c30fd03cb924ccc300cb3bfd84388c6a550 100644 (file)
@@ -63,7 +63,7 @@ ModelExecution::ModelExecution(ModelChecker *m, Scheduler *scheduler) :
        thrd_last_fence_release(),
        priv(new struct model_snapshot_members ()),
        mo_graph(new CycleGraph()),
-       fuzzer(new NewFuzzer()),
+       fuzzer(new Fuzzer()),
        isfinished(false)
 {
        /* Initialize a model-checker thread, for special ModelActions */
@@ -1773,8 +1773,18 @@ void ModelExecution::collectActions() {
                ModelAction *act = it->getVal();
                //Do iteration early since we may delete node...
                it=it->getPrev();
+               bool islastact = false;
+               ModelAction *lastact = get_last_action(act->get_tid());
+               if (act == lastact) {
+                       Thread * th = get_thread(act);
+                       islastact = !th->is_complete();
+               }
+
                if (act->is_read()) {
-                       if (act->get_reads_from()->is_free()) {
+                       if (islastact) {
+                               act->set_read_from(NULL);
+                               continue;
+                       } else if (act->get_reads_from()->is_free()) {
                                removeAction(act);
                                delete act;
                        } else {
@@ -1788,6 +1798,8 @@ void ModelExecution::collectActions() {
                                                act->set_last_fence_release(NULL);
                                }
                        }
+               } else if (islastact) {
+                       continue;
                } else if (act->is_free()) {
                        removeAction(act);
                        delete act;
@@ -1823,6 +1835,11 @@ void ModelExecution::collectActions() {
                                        removeAction(act);
                                        delete act;
                                }
+                       } else if (act->is_create()) {
+                               if (act->get_thread_operand()->is_complete()) {
+                                       removeAction(act);
+                                       delete act;
+                               }
                        } else {
                                removeAction(act);
                                delete act;