&ttd);
/* both should be available */
+ readCBCalled = false;
+ writeCBCalled = false;
readyFDs.clear();
+
mplexer->getAvailableFDs(readyFDs, 0);
- if (readyFDs.size() == 1) {
- /* something is wrong, we need some debug infos */
- cerr<<"FDMultiPlexer implementation is "<<mplexer->getName()<<endl;
- cerr<<"Watching "<<mplexer->getWatchedFDCount(false)<<" FDs for read and "<<mplexer->getWatchedFDCount(true)<<" for write"<<endl;
- cerr<<"pipes[0] is "<<pipes[0]<<endl;
- cerr<<"pipes[1] is "<<pipes[1]<<endl;
- cerr<<"The file descriptor returned as ready is "<<readyFDs.at(0)<<endl;
- char buffer[2];
- ssize_t res = write(pipes[1], "0", 1);
- int saved = errno;
- cerr<<"Writing to pipes[1] returns "<<res<<endl;
- if (res == -1) {
- cerr<<"errno is "<<saved<<endl;
- }
- res = read(pipes[0], &buffer[0], sizeof(buffer));
- saved = errno;
- cerr<<"Reading from pipes[0] returns "<<res<<endl;
- if (res == -1) {
- cerr<<"errno is "<<saved<<endl;
- }
+ BOOST_REQUIRE_GT(readyFDs.size(), 0);
+ if (readyFDs.size() == 2) {
+ ready = mplexer->run(&now, 100);
+ BOOST_CHECK_EQUAL(ready, 2);
+ }
+ else if (readyFDs.size() == 1) {
+ /* under high pressure (lots of existing pipes on the system, for example,
+ the pipe might only have room for one 'buffer' and will not be writable
+ after our write of 1 byte, we need to read it so that the pipe becomes
+ writable again */
+ /* make sure the pipe is readable, otherwise something is off */
+ BOOST_REQUIRE_EQUAL(readyFDs.at(0), pipes[0]);
+ ready = mplexer->run(&now, 100);
+ BOOST_CHECK_EQUAL(ready, 1);
+ BOOST_CHECK_EQUAL(readCBCalled, true);
+ BOOST_CHECK_EQUAL(writeCBCalled, false);
+ char buffer[1];
+ ssize_t got = read(pipes[0], &buffer[0], sizeof(buffer));
+ BOOST_CHECK_EQUAL(got, 1);
+
+ /* ok, the pipe should be writable now, but not readable */
+ readyFDs.clear();
+ mplexer->getAvailableFDs(readyFDs, 0);
+ BOOST_CHECK_EQUAL(readyFDs.size(), 1);
+ BOOST_REQUIRE_EQUAL(readyFDs.at(0), pipes[1]);
+
+ ready = mplexer->run(&now, 100);
+ BOOST_CHECK_EQUAL(ready, 1);
}
- BOOST_CHECK_EQUAL(readyFDs.size(), 2);
- readCBCalled = false;
- writeCBCalled = false;
- ready = mplexer->run(&now, 100);
- BOOST_CHECK_EQUAL(ready, 2);
BOOST_CHECK_EQUAL(readCBCalled, true);
BOOST_CHECK_EQUAL(writeCBCalled, true);