Add SIGTERM handler. (#1440)
authorMathias Preiner <mathias.preiner@gmail.com>
Tue, 12 Dec 2017 19:34:46 +0000 (11:34 -0800)
committerGitHub <noreply@github.com>
Tue, 12 Dec 2017 19:34:46 +0000 (11:34 -0800)
Print statistics if CVC4 gets a SIGTERM signal.

src/main/util.cpp

index 110fc2c67bf9281d2cb64314911ecc466ffd8430..43c880a7fe1119c8939e22c1f60f85ea1a5ea040 100644 (file)
@@ -77,6 +77,14 @@ void timeout_handler(int sig, siginfo_t* info, void*) {
   abort();
 }
 
+/** Handler for SIGTERM. */
+void sigterm_handler(int sig, siginfo_t* info, void*)
+{
+  safe_print(STDERR_FILENO, "CVC4 interrupted by SIGTERM.\n");
+  print_statistics();
+  abort();
+}
+
 /** Handler for SIGINT, i.e., when the user hits control C. */
 void sigint_handler(int sig, siginfo_t* info, void*) {
   safe_print(STDERR_FILENO, "CVC4 interrupted by user.\n");
@@ -321,6 +329,15 @@ void cvc4_init() throw(Exception) {
   }
 #endif /* HAVE_SIGALTSTACK */
 
+  struct sigaction act5;
+  act5.sa_sigaction = sigterm_handler;
+  act5.sa_flags = SA_SIGINFO;
+  sigemptyset(&act5.sa_mask);
+  if (sigaction(SIGTERM, &act5, NULL))
+  {
+    throw Exception(string("sigaction(SIGTERM) failure: ") + strerror(errno));
+  }
+
 #endif /* __WIN32__ */
 
   set_unexpected(cvc4unexpected);