about summary refs log tree commit diff stats
path: root/subx/003trace.cc
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2018-07-26 17:00:14 -0700
committerKartik Agaram <vc@akkartik.com>2018-07-26 17:00:37 -0700
commita7291869f5174076b8d4ee0f352d0d734bd66774 (patch)
treebef98c313b4d28b0e298ddef46dc8ed3e9992e0c /subx/003trace.cc
parent87fe3d7a9e5ae9503ee89a3d69f8b84a88ad24de (diff)
downloadmu-a7291869f5174076b8d4ee0f352d0d734bd66774.tar.gz
4427 - support for '--trace' argv
This ports commit 4421 to the subx/ program.
Diffstat (limited to 'subx/003trace.cc')
-rw-r--r--subx/003trace.cc45
1 files changed, 34 insertions, 11 deletions
diff --git a/subx/003trace.cc b/subx/003trace.cc
index 994b5eca..f5969de6 100644
--- a/subx/003trace.cc
+++ b/subx/003trace.cc
@@ -77,14 +77,36 @@ struct trace_line {
 };
 
 :(before "End Globals")
-bool Hide_errors = false;
-bool Dump_trace = false;
-string Dump_label = "";
+bool Hide_errors = false;  // if set, don't print even error trace lines to screen
+bool Dump_trace = false;  // if set, print trace lines to screen
+string Dump_label = "";  // if set, print trace lines matching a single label to screen
 :(before "End Reset")
 Hide_errors = false;
 Dump_trace = false;
 Dump_label = "";
 
+//: Support for tracing an entire run.
+//: Traces can have a lot of overhead, so only turn them on when asked.
+:(before "End Commandline Options(*arg)")
+else if (is_equal(*arg, "--trace")) {
+  Save_trace = true;
+}
+:(before "End Commandline Parsing")
+if (Save_trace) {
+  cerr << "initializing trace\n";
+  Trace_stream = new trace_stream;
+}
+:(code)
+void cleanup_main() {
+  if (!Trace_stream) return;
+  if (Save_trace)
+    Trace_stream->save();
+  delete Trace_stream;
+  Trace_stream = NULL;
+}
+:(before "End One-time Setup")
+atexit(cleanup_main);
+
 :(before "End Types")
 // Pre-define some global constants that trace_stream needs to know about.
 // Since they're in the Types section, they'll be included in any cleaved
@@ -116,6 +138,13 @@ struct trace_stream {
     return *curr_stream;
   }
 
+  void save() {
+    cerr << "saving trace to 'last_run'\n";
+    ofstream fout("last_run");
+    fout << readable_contents("");
+    fout.close();
+  }
+
   // be sure to call this before messing with curr_stream or curr_label
   void newline();
   // useful for debugging
@@ -189,7 +218,7 @@ ostream& operator<<(ostream& os, end /*unused*/) {
 }
 
 :(before "End Globals")
-bool Save_trace = false;
+bool Save_trace = false;  // if set, write out trace to disk
 
 // Trace_stream is a resource, lease_tracer uses RAII to manage it.
 :(before "End Types")
@@ -200,12 +229,7 @@ struct lease_tracer {
 :(code)
 lease_tracer::lease_tracer() { Trace_stream = new trace_stream; }
 lease_tracer::~lease_tracer() {
-  if (!Trace_stream) return;  // in case tests close Trace_stream
-  if (Save_trace) {
-    ofstream fout("last_trace");
-    fout << Trace_stream->readable_contents("");
-    fout.close();
-  }
+  if (Save_trace) Trace_stream->save();
   delete Trace_stream, Trace_stream = NULL;
 }
 :(before "End Includes")
@@ -371,7 +395,6 @@ using std::vector;
 using std::list;
 #include <set>
 using std::set;
-#include <algorithm>
 
 #include <sstream>
 using std::istringstream;