Adding support for spec 183.equake

Change-Id: Idd22d54459006922bb16755b74e3fc5fb9efd9b4
diff --git a/benchmarks/main.cc b/benchmarks/main.cc
index a942ea6..fbac063 100644
--- a/benchmarks/main.cc
+++ b/benchmarks/main.cc
@@ -28,6 +28,11 @@
   ArtFixture() : SpecFixture("179.art"){};
 };
 
+class EquakeFixture : public SpecFixture {
+ protected:
+  EquakeFixture() : SpecFixture("183.equake"){};
+};
+
 }  // namespace
 
 std::string executableDir;
@@ -83,6 +88,16 @@
   }
 }
 
+BENCHMARK_F(EquakeFixture, 183_equake)(benchmark::State& st) {
+  while (st.KeepRunning()) {
+    if ((RunSpec(NULL, 0, "inp.in")) != 0) {
+      st.SkipWithError(
+          (std::string("Error while running benchmark: ") + strerror(errno))
+              .c_str());
+    }
+  }
+}
+
 int main(int argc, char* argv[]) {
   ::benchmark::Initialize(&argc, argv);
   google::InitGoogleLogging(argv[0]);
diff --git a/benchmarks/spec_fixture.cc b/benchmarks/spec_fixture.cc
index 4f76360..cbc3db2 100644
--- a/benchmarks/spec_fixture.cc
+++ b/benchmarks/spec_fixture.cc
@@ -95,19 +95,32 @@
   // Capture output
   char buffer[page_size];
   int out_p[2];
+  int err_p[2];
   int old_stdout = dup(STDOUT_FILENO);
+  int old_stderr = dup(STDERR_FILENO);
   if (pipe2(out_p, O_NONBLOCK) != 0) {
     LOG(ERROR) << "Not able create pipe, Error: " << strerror(errno);
     return errno;
   }
-  ScopedGuard guard([&]() { close(out_p[0]); });
+  ScopedGuard out_guard([&]() { close(out_p[0]); });
+
+  if (pipe2(err_p, O_NONBLOCK) != 0) {
+    close(out_p[1]);
+    LOG(ERROR) << "Not able create pipe, Error: " << strerror(errno);
+    return errno;
+  }
+  ScopedGuard err_guard([&]() { close(err_p[0]); });
+  dup2(err_p[1], STDERR_FILENO);
+  close(err_p[1]);
   dup2(out_p[1], STDOUT_FILENO);
   close(out_p[1]);
 
   int status = LaunchProcess(argv, args_length + 1, input_filename);
 
   fflush(stdout);
+  fflush(stderr);
   dup2(old_stdout, STDOUT_FILENO);
+  dup2(old_stderr, STDERR_FILENO);
   if (chdir(executableDir.c_str()) != 0) {
     LOG(ERROR) << "Not able to change dir to " << executableDir
                << ", Error: " << strerror(errno);
@@ -127,6 +140,14 @@
       fwrite(buffer, sizeof(char), len, stderr);
     } while (len == page_size);
     fprintf(stderr, "\n");
+    do {
+      len = read(err_p[0], buffer, page_size);
+      if (len == -1) {
+        LOG(ERROR) << "Error reading from pipe: " << strerror(errno);
+        return errno;
+      }
+      fwrite(buffer, sizeof(char), len, stderr);
+    } while (len == page_size);
     return 1;
   }
   return 0;