Add pthread functions
[c11tester.git] / execution.cc
index 796e9b74840ccb52233a55b16abacc843f408fba..de54394c49a034aedec1465082ce316f19a21bc5 100644 (file)
@@ -1527,6 +1527,40 @@ void ModelExecution::print_summary()
 
 }
 
+void ModelExecution::print_tail()
+{
+       model_print("Execution trace %d:\n", get_execution_number());
+
+       sllnode<ModelAction*> *it;
+
+       model_print("------------------------------------------------------------------------------------\n");
+       model_print("#    t    Action type     MO       Location         Value               Rf  CV\n");
+       model_print("------------------------------------------------------------------------------------\n");
+
+       unsigned int hash = 0;
+
+       int length = 25;
+       int counter = 0;
+       SnapList<ModelAction *> list;
+       for (it = action_trace.end(); it != NULL; it = it->getPrev()) {
+               if (counter > length)
+                       break;
+
+               ModelAction * act = it->getVal();
+               list.push_front(act);
+               counter++;
+       }
+
+       for (it = list.begin();it != NULL;it=it->getNext()) {
+               const ModelAction *act = it->getVal();
+               if (act->get_seq_number() > 0)
+                       act->print();
+               hash = hash^(hash<<3)^(it->getVal()->hash());
+       }
+       model_print("HASH %u\n", hash);
+       model_print("------------------------------------------------------------------------------------\n");
+}
+
 /**
  * Add a Thread to the system for the first time. Should only be called once
  * per thread.
@@ -1577,8 +1611,12 @@ Thread * ModelExecution::get_pthread(pthread_t pid) {
        } x;
        x.p = pid;
        uint32_t thread_id = x.v;
+       return get_thread(thread_id);   // Temporary fix for firefox
+
+/*
        if (thread_id < pthread_counter + 1) return pthread_map[thread_id];
        else return NULL;
+*/
 }
 
 /**
@@ -1755,27 +1793,6 @@ void ModelExecution::collectActions() {
 
                //Free if it is invisible or we have set a flag to remove visible actions.
                if (actseq <= tid_clock || params->removevisible) {
-                       // For read or rmw actions being used by ModelHistory, mark the reads_from as being used. 
-                       if (act->is_read()) {
-                               if (act->is_rmw()) {
-                                       void * func_act_ref = act->getFuncActRef();
-                                       if (func_act_ref == WRITE_REFERENCED) {
-                                               // Only the write part of this rmw is referenced, do nothing
-                                       } else if (func_act_ref != NULL) {
-                                               // The read part of rmw is potentially referenced
-                                               ModelAction * reads_from = act->get_reads_from();
-                                               if (reads_from->getFuncActRef() == NULL)
-                                                       reads_from->setFuncActRef(WRITE_REFERENCED);
-                                       }
-                               } else {
-                                       if (act->getFuncActRef() != NULL) {
-                                               ModelAction * reads_from = act->get_reads_from();
-                                               if (reads_from->getFuncActRef() == NULL)
-                                                       reads_from->setFuncActRef(WRITE_REFERENCED);
-                                       }
-                               }
-                       }
-
                        ModelAction * write;
                        if (act->is_write()) {
                                write = act;
@@ -1795,8 +1812,6 @@ void ModelExecution::collectActions() {
                                                CycleNode * prevnode = node->getInEdge(i);
                                                ModelAction * prevact = prevnode->getAction();
                                                if (prevact->get_type() != READY_FREE) {
-                                                       // Save the original action type
-                                                       prevact->set_original_type(prevact->get_type());
                                                        prevact->set_free();
                                                        queue->push_back(prevnode);
                                                }
@@ -1820,29 +1835,8 @@ void ModelExecution::collectActions() {
                }
 
                if (act->is_read()) {
-                       // For read or rmw actions being used by ModelHistory, mark the reads_from as being used. 
-                       if (act->is_rmw()) {
-                               void * func_act_ref = act->getFuncActRef();
-                               if (func_act_ref == WRITE_REFERENCED) {
-                                       // Only the write part of this rmw is referenced, do nothing
-                               } else if (func_act_ref != NULL) {
-                                       // The read part of rmw is potentially referenced
-                                       ModelAction * reads_from = act->get_reads_from();
-                                       if (reads_from->getFuncActRef() == NULL)
-                                               reads_from->setFuncActRef(WRITE_REFERENCED);
-                               }
-                       } else {
-                               if (act->getFuncActRef() != NULL) {
-                                       ModelAction * reads_from = act->get_reads_from();
-                                       if (reads_from->getFuncActRef() == NULL)
-                                               reads_from->setFuncActRef(WRITE_REFERENCED);
-                               }
-                       }
-
                        if (act->get_reads_from()->is_free()) {
                                if (act->is_rmw()) {
-                                       // Save the original action type
-                                       act->set_original_type(act->get_type());
                                        //Weaken a RMW from a freed store to a write
                                        act->set_type(ATOMIC_WRITE);
                                } else {
@@ -1851,12 +1845,8 @@ void ModelExecution::collectActions() {
                                                fixupLastAct(act);
                                        }
 
-                                       // Only delete this action if not being using by ModelHistory.
-                                       // Otherwise, the deletion of action is deferred.
-                                       if (act->getFuncActRef() == NULL) {
-                                               delete act;
-                                               continue;
-                                       }
+                                       delete act;
+                                       continue;
                                }
                        }
                }
@@ -1887,18 +1877,14 @@ void ModelExecution::collectActions() {
                if (act->is_read()) {
                        if (act->get_reads_from()->is_free()) {
                                if (act->is_rmw()) {
-                                       // Save the original action type
-                                       act->set_original_type(act->get_type());
                                        act->set_type(ATOMIC_WRITE);
                                } else {
                                        removeAction(act);
                                        if (islastact) {
                                                fixupLastAct(act);
                                        }
-                                       if (act->getFuncActRef() == NULL) {
-                                               delete act;
-                                               continue;
-                                       }
+                                       delete act;
+                                       continue;
                                }
                        }
                } else if (act->is_free()) {
@@ -1906,10 +1892,8 @@ void ModelExecution::collectActions() {
                        if (islastact) {
                                fixupLastAct(act);
                        }
-                       if (act->getFuncActRef() == NULL) {
-                               delete act;
-                               continue;
-                       }
+                       delete act;
+                       continue;
                } else if (act->is_write()) {
                        //Do nothing with write that hasn't been marked to be freed
                } else if (islastact) {