#include <stdio.h>
#include <algorithm>
-#include <mutex>
#include <new>
#include <stdarg.h>
#include "execution.h"
#include "bugmessage.h"
-#define INITIAL_THREAD_ID 0
-
ModelChecker *model;
/** @brief Constructor */
params(params),
scheduler(new Scheduler()),
node_stack(new NodeStack()),
- execution(new ModelExecution(¶ms, scheduler, node_stack)),
+ execution(new ModelExecution(this, &this->params, scheduler, node_stack)),
+ execution_number(1),
diverge(NULL),
earliest_diverge(NULL),
- trace_analyses(new ModelVector<TraceAnalysis *>())
+ trace_analyses()
{
}
ModelChecker::~ModelChecker()
{
delete node_stack;
- for (unsigned int i = 0; i < trace_analyses->size(); i++)
- delete (*trace_analyses)[i];
- delete trace_analyses;
delete scheduler;
}
/** @brief Print bug report listing for this execution (if any bugs exist) */
void ModelChecker::print_bugs() const
{
- if (execution->have_bug_reports()) {
- SnapVector<bug_message *> *bugs = execution->get_bugs();
-
- model_print("Bug report: %zu bug%s detected\n",
- bugs->size(),
- bugs->size() > 1 ? "s" : "");
- for (unsigned int i = 0; i < bugs->size(); i++)
- (*bugs)[i]->print();
- }
+ SnapVector<bug_message *> *bugs = execution->get_bugs();
+
+ model_print("Bug report: %zu bug%s detected\n",
+ bugs->size(),
+ bugs->size() > 1 ? "s" : "");
+ for (unsigned int i = 0; i < bugs->size(); i++)
+ (*bugs)[i]->print();
}
/**
*/
void ModelChecker::print_execution(bool printbugs) const
{
+ model_print("Program output from execution %d:\n",
+ get_execution_number());
print_program_output();
- if (params.verbose) {
- model_print("Earliest divergence point since last feasible execution:\n");
+ if (params.verbose >= 2) {
+ model_print("\nEarliest divergence point since last feasible execution:\n");
if (earliest_diverge)
earliest_diverge->print();
else
}
/* Don't print invalid bugs */
- if (printbugs)
+ if (printbugs && execution->have_bug_reports()) {
+ model_print("\n");
print_bugs();
+ }
model_print("\n");
execution->print_summary();
diverge->print();
}
- execution->increment_execution_number();
+ execution_number++;
+
reset_to_initial_state();
return true;
}
/** @brief Run trace analyses on complete trace */
void ModelChecker::run_trace_analyses() {
- for (unsigned int i = 0; i < trace_analyses->size(); i++)
- (*trace_analyses)[i]->analyze(execution->get_action_trace());
+ for (unsigned int i = 0; i < trace_analyses.size(); i++)
+ trace_analyses[i]->analyze(execution->get_action_trace());
}
/**
* thread which just took a step--plus the first step
* for any newly-created thread
*/
- for (unsigned int i = 0; i < execution->get_num_threads(); i++) {
+ for (unsigned int i = 0; i < get_num_threads(); i++) {
thread_id_t tid = int_to_id(i);
Thread *thr = get_thread(tid);
if (!thr->is_model_thread() && !thr->is_complete() && !thr->get_pending()) {
model_print("******* Model-checking complete: *******\n");
print_stats();
+
+ /* Have the trace analyses dump their output. */
+ for (unsigned int i = 0; i < trace_analyses.size(); i++)
+ trace_analyses[i]->finish();
}