Module Name: src
Committed By: jmmv
Date: Thu Aug 26 15:28:31 UTC 2010
Modified Files:
src/external/bsd/atf/dist/atf-c++: io.cpp io.hpp io_test.cpp
src/external/bsd/atf/dist/atf-run: test-program.cpp
Log Message:
Partially pull up the following revisions that address ticket #53:
996f9c26e07a86607f373c8f0243d57329c11543
ef98529abaf16e40a2e684496bf3da8f9ff0d09c
These prevent atf-run from stalling/crashing when a subprocess of a test
case stays around after the test case itself exits.
Reported, and verified working, by po...@.
To generate a diff of this commit:
cvs rdiff -u -r1.1.1.3 -r1.2 src/external/bsd/atf/dist/atf-c++/io.cpp
cvs rdiff -u -r1.1.1.2 -r1.2 src/external/bsd/atf/dist/atf-c++/io.hpp
cvs rdiff -u -r1.1.1.1 -r1.2 src/external/bsd/atf/dist/atf-c++/io_test.cpp
cvs rdiff -u -r1.3 -r1.4 src/external/bsd/atf/dist/atf-run/test-program.cpp
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/bsd/atf/dist/atf-c++/io.cpp
diff -u src/external/bsd/atf/dist/atf-c++/io.cpp:1.1.1.3 src/external/bsd/atf/dist/atf-c++/io.cpp:1.2
--- src/external/bsd/atf/dist/atf-c++/io.cpp:1.1.1.3 Sat Jul 3 08:04:50 2010
+++ src/external/bsd/atf/dist/atf-c++/io.cpp Thu Aug 26 15:28:31 2010
@@ -368,7 +368,8 @@
}
void
-impl::std_muxer::read(unbuffered_istream& out, unbuffered_istream& err)
+impl::std_muxer::read(unbuffered_istream& out, unbuffered_istream& err,
+ const bool& terminate)
{
struct pollfd fds[2];
fds[0].fd = out.get_fh().get();
@@ -379,8 +380,15 @@
do {
fds[0].revents = 0;
fds[1].revents = 0;
- if (::poll(fds, 2, -1) == -1)
- break;
+
+ int ret;
+ while ((ret = ::poll(fds, 2, 250)) <= 0) {
+ if (terminate || ret == -1) {
+ fds[0].events = 0;
+ fds[1].events = 0;
+ break;
+ }
+ }
if (fds[0].revents & POLLIN) {
std::string line;
@@ -388,7 +396,7 @@
got_stdout_line(line);
else
fds[0].events &= ~POLLIN;
- } else if (fds[0].revents & POLLHUP)
+ } else if (fds[0].revents & POLLERR || fds[0].revents & POLLHUP)
fds[0].events &= ~POLLIN;
if (fds[1].revents & POLLIN) {
@@ -397,7 +405,7 @@
got_stderr_line(line);
else
fds[1].events &= ~POLLIN;
- } else if (fds[1].revents & POLLHUP)
+ } else if (fds[1].revents & POLLERR || fds[1].revents & POLLHUP)
fds[1].events &= ~POLLIN;
} while (fds[0].events & POLLIN || fds[1].events & POLLIN);
Index: src/external/bsd/atf/dist/atf-c++/io.hpp
diff -u src/external/bsd/atf/dist/atf-c++/io.hpp:1.1.1.2 src/external/bsd/atf/dist/atf-c++/io.hpp:1.2
--- src/external/bsd/atf/dist/atf-c++/io.hpp:1.1.1.2 Sat May 8 08:05:21 2010
+++ src/external/bsd/atf/dist/atf-c++/io.hpp Thu Aug 26 15:28:31 2010
@@ -578,7 +578,7 @@
std_muxer(void);
virtual ~std_muxer(void);
- void read(unbuffered_istream&, unbuffered_istream&);
+ void read(unbuffered_istream&, unbuffered_istream&, const bool&);
};
// ------------------------------------------------------------------------
Index: src/external/bsd/atf/dist/atf-c++/io_test.cpp
diff -u src/external/bsd/atf/dist/atf-c++/io_test.cpp:1.1.1.1 src/external/bsd/atf/dist/atf-c++/io_test.cpp:1.2
--- src/external/bsd/atf/dist/atf-c++/io_test.cpp:1.1.1.1 Sat Jul 3 08:04:51 2010
+++ src/external/bsd/atf/dist/atf-c++/io_test.cpp Thu Aug 26 15:28:31 2010
@@ -502,7 +502,8 @@
atf::io::unbuffered_istream errs(errfh);
test_std_muxer m;
- m.read(outs, errs);
+ bool terminate = false;
+ m.read(outs, errs, terminate);
ATF_CHECK(m.m_eof);
ATF_CHECK(m.m_stdout_lines.empty());
ATF_CHECK(m.m_stderr_lines.empty());
@@ -530,7 +531,8 @@
atf::io::unbuffered_istream errs(errfh);
test_std_muxer m;
- m.read(outs, errs);
+ bool terminate = false;
+ m.read(outs, errs, terminate);
ATF_CHECK(m.m_eof);
ATF_CHECK_EQUAL(3, m.m_stdout_lines.size());
ATF_CHECK_EQUAL("stdout line 1", m.m_stdout_lines[0]);
Index: src/external/bsd/atf/dist/atf-run/test-program.cpp
diff -u src/external/bsd/atf/dist/atf-run/test-program.cpp:1.3 src/external/bsd/atf/dist/atf-run/test-program.cpp:1.4
--- src/external/bsd/atf/dist/atf-run/test-program.cpp:1.3 Sat Jul 3 08:11:26 2010
+++ src/external/bsd/atf/dist/atf-run/test-program.cpp Thu Aug 26 15:28:31 2010
@@ -646,6 +646,18 @@
return detail::parse_test_case_result(line);
}
+namespace {
+
+static bool sigchld_received;
+
+static void
+sigchld_handler(const int signo)
+{
+ sigchld_received = true;
+}
+
+} // anonymous namespace
+
std::pair< std::string, atf::process::status >
impl::run_test_case(const atf::fs::path& executable,
const std::string& test_case_name,
@@ -683,8 +695,11 @@
// Process the test case's output and multiplex it into our output
// stream as we read it.
try {
+ atf::signals::signal_programmer sigchld(SIGCHLD, sigchld_handler);
+
output_muxer muxer(writer);
- muxer.read(outin, errin);
+ sigchld_received = false;
+ muxer.read(outin, errin, sigchld_received);
outin.close();
errin.close();
} catch (...) {
@@ -697,8 +712,9 @@
std::string reason;
if (timeout_timer.fired()) {
- INV(status.signaled());
- INV(status.termsig() == SIGKILL);
+ // Don't assume the child process has been signaled due to the timeout
+ // expiration as older versions did. The child process may have exited
+ // but we may have timed out due to a subchild process getting stuck.
reason = "Test case timed out after " + atf::text::to_string(timeout) +
" " + (timeout == 1 ? "second" : "seconds");
}