}
+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.
} 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;
+*/
}
/**
//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;
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);
}
}
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 {
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;
}
}
}
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()) {
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) {