summaryrefslogtreecommitdiff
path: root/mteval/ns_ext.cc
diff options
context:
space:
mode:
authorChris Dyer <cdyer@allegro.clab.cs.cmu.edu>2014-03-19 23:01:55 -0400
committerChris Dyer <cdyer@allegro.clab.cs.cmu.edu>2014-03-19 23:01:55 -0400
commit6d94c3484726c37d79d7e9b9e114121ca679487e (patch)
tree0a754c8b3c3d7970dc42946a579316c0606ea7d4 /mteval/ns_ext.cc
parenta1ff38d3427cf0892c3ea174da6939c8aea908bc (diff)
don't get blocked on zombies
Diffstat (limited to 'mteval/ns_ext.cc')
-rw-r--r--mteval/ns_ext.cc16
1 files changed, 16 insertions, 0 deletions
diff --git a/mteval/ns_ext.cc b/mteval/ns_ext.cc
index 1e7e2bc1..9d2c75c6 100644
--- a/mteval/ns_ext.cc
+++ b/mteval/ns_ext.cc
@@ -4,6 +4,8 @@
#include <cstdlib>
#include <cstring>
#include <unistd.h>
+#include <signal.h>
+#include <sys/wait.h>
#include <sstream>
#include <iostream>
#include <cassert>
@@ -13,6 +15,14 @@
using namespace std;
+void metric_child_signal_handler(int signo) {
+ int status = 0;
+ cerr << "Received SIGCHLD(" << signo << ") ... aborting.\n";
+ // reap zombies
+ while (waitpid(-1, &status, WNOHANG) > 0) {}
+ abort();
+}
+
struct NScoreServer {
NScoreServer(const std::string& cmd);
~NScoreServer();
@@ -27,6 +37,12 @@ struct NScoreServer {
};
NScoreServer::NScoreServer(const string& cmd) {
+ static bool need_init = true;
+ if (need_init) {
+ need_init = false;
+ signal(SIGCHLD, metric_child_signal_handler);
+ }
+
cerr << "Invoking " << cmd << " ..." << endl;
if (pipe(p2c) < 0) { perror("pipe"); exit(1); }
if (pipe(c2p) < 0) { perror("pipe"); exit(1); }