Fix total time statistic (#6233)
authorGereon Kremer <gereon.kremer@cs.rwth-aachen.de>
Tue, 30 Mar 2021 01:06:14 +0000 (03:06 +0200)
committerGitHub <noreply@github.com>
Tue, 30 Mar 2021 01:06:14 +0000 (01:06 +0000)
Since one of the last changes to the total time collection in the driver, this collection fails when the solver terminates unexpectedly (either by a signal or an exception). This PR fixes this issue and does some cleanup along the way.

src/main/driver_unified.cpp
src/main/main.cpp
src/main/main.h
src/main/signal_handlers.cpp

index d2b676e82c8c39989a375b7aa19a65c02054c62f..2bca01e08f1500bbcf32f197578631854ac3a610 100644 (file)
@@ -57,7 +57,20 @@ namespace CVC4 {
     const std::string *progName;
 
     /** A pointer to the CommandExecutor (the signal handlers need it) */
-    CVC4::main::CommandExecutor* pExecutor = nullptr;
+    std::unique_ptr<CVC4::main::CommandExecutor> pExecutor;
+
+    /** The time point the binary started, accessible to signal handlers */
+    std::unique_ptr<TotalTimer> totalTime;
+
+    TotalTimer::~TotalTimer()
+    {
+      if (pExecutor != nullptr)
+      {
+        auto duration = std::chrono::steady_clock::now() - d_start;
+        pExecutor->getSmtEngine()->setTotalTimeStatistic(
+            std::chrono::duration<double>(duration).count());
+      }
+    }
 
   }/* CVC4::main namespace */
 }/* CVC4 namespace */
@@ -78,8 +91,7 @@ void printUsage(Options& opts, bool full) {
 }
 
 int runCvc4(int argc, char* argv[], Options& opts) {
-
-  std::chrono::time_point totalTimeStart = std::chrono::steady_clock::now();
+  main::totalTime = std::make_unique<TotalTimer>();
   // For the signal handlers' benefit
   pOptions = &opts;
 
@@ -176,7 +188,7 @@ int runCvc4(int argc, char* argv[], Options& opts) {
   (*(opts.getOut())) << language::SetLanguage(opts.getOutputLanguage());
 
   // Create the command executor to execute the parsed commands
-  pExecutor = new CommandExecutor(opts);
+  pExecutor = std::make_unique<CommandExecutor>(opts);
 
   int returnValue = 0;
   {
@@ -457,10 +469,8 @@ int runCvc4(int argc, char* argv[], Options& opts) {
     // or other on_exit/atexit stuff.
     _exit(returnValue);
 #endif /* CVC4_COMPETITION_MODE */
-    pExecutor->getSmtEngine()->setResultStatistic(result.toString());
-    std::chrono::duration totalTime = std::chrono::steady_clock::now() - totalTimeStart;
-    pExecutor->getSmtEngine()->setTotalTimeStatistic(std::chrono::duration<double>(totalTime).count());
 
+    totalTime.reset();
     pExecutor->flushOutputStreams();
 
 #ifdef CVC4_DEBUG
@@ -474,9 +484,7 @@ int runCvc4(int argc, char* argv[], Options& opts) {
 #endif /* CVC4_DEBUG */
   }
 
-  delete pExecutor;
-
-  pExecutor = nullptr;
+  pExecutor.reset();
 
   signal_handlers::cleanup();
 
index eb313c3bdc1ce1ec106c82ee05e1f4f8f4b32cb6..65b341a12283cd54937539e74c7bf8b8871560ab 100644 (file)
@@ -66,7 +66,9 @@ int main(int argc, char* argv[]) {
     } else {
       *opts.getErr() << "(error \"" << e << "\")" << endl;
     }
-    if(opts.getStatistics() && pExecutor != NULL) {
+    if (opts.getStatistics() && pExecutor != nullptr)
+    {
+      totalTime.reset();
       pExecutor->flushStatistics(*opts.getErr());
     }
   }
index b769bee7d970be05da70a870b98b81e0afc904e0..5181455777bee9f79ec60bad8ac55089a25805ed 100644 (file)
@@ -14,7 +14,9 @@
  ** Header for main CVC4 driver.
  **/
 
+#include <chrono>
 #include <exception>
+#include <memory>
 #include <string>
 
 #include "base/exception.h"
@@ -36,7 +38,20 @@ extern const char* progPath;
 extern const std::string* progName;
 
 /** A reference for use by the signal handlers to print statistics */
-extern CVC4::main::CommandExecutor* pExecutor;
+extern std::unique_ptr<CVC4::main::CommandExecutor> pExecutor;
+
+/** Manages a custom timer for the total runtime in RAII-style. */
+class TotalTimer
+{
+ public:
+  TotalTimer() : d_start(std::chrono::steady_clock::now()) {}
+  ~TotalTimer();
+
+ private:
+  std::chrono::steady_clock::time_point d_start;
+};
+/** The time point the binary started, accessible to signal handlers */
+extern std::unique_ptr<TotalTimer> totalTime;
 
 /**
  * If true, will not spin on segfault even when CVC4_DEBUG is on.
index ccd6c0b19bd8da0cb8d255edd53d73877676164b..93014b25646e8cb220638bf172860329734b0aff 100644 (file)
@@ -60,6 +60,7 @@ void print_statistics()
 {
   if (pOptions != NULL && pOptions->getStatistics() && pExecutor != NULL)
   {
+    totalTime.reset();
     pExecutor->safeFlushStatistics(STDERR_FILENO);
   }
 }