HERE_DOCUMENT
+add_to_report <<HERE_DOCUMENT
+IO Event Handling:
+ select yes
+HERE_DOCUMENT
+
+if test '@HAVE_EPOLL@' != 'no'; then
+add_to_report <<HERE_DOCUMENT
+ epoll yes
+HERE_DOCUMENT
+
+else
+
+add_to_report <<HERE_DOCUMENT
+ epoll no
+HERE_DOCUMENT
+fi
+
+if test '@HAVE_KQUEUE@' != 'no'; then
+add_to_report <<HERE_DOCUMENT
+ kqueue yes
+HERE_DOCUMENT
+
+else
+
+add_to_report <<HERE_DOCUMENT
+ kqueue no
+HERE_DOCUMENT
+fi
+
+add_to_report <<HERE_DOCUMENT
+ poll yes
+
+HERE_DOCUMENT
+
if test '@HAVE_MYSQL@' != 'no'; then
add_to_report <<HERE_DOCUMENT
MySQL: @MYSQL_VERSION@
else
report_conf_data.set('BISON', 'no')
endif
+if HAVE_EPOLL
+ report_conf_data.set('HAVE_EPOLL', 'yes')
+else
+ report_conf_data.set('HAVE_EPOLL', 'no')
+endif
+if HAVE_KQUEUE
+ report_conf_data.set('HAVE_KQUEUE', 'yes')
+else
+ report_conf_data.set('HAVE_KQUEUE', 'no')
+endif
if MYSQL_DEP.found()
report_conf_data.set('HAVE_MYSQL', 'yes')
version = MYSQL_DEP.version()
ssize_t bytes_written = write(fds[1], &locked, sizeof(locked));
EXPECT_EQ(sizeof(locked), bytes_written);
- sleep(1);
-
close(fds[1]);
exit(0);
} else {
ssize_t bytes_written = write(fds[1], &locked, sizeof(locked));
EXPECT_EQ(sizeof(locked), bytes_written);
- sleep(1);
-
close(fds[1]);
exit(0);
} else {
result = epoll_wait(epollfd_, used_data_.data(), used_data_.size(), timeout);
for (int i = 0; i < result; ++i) {
map_[used_data_[i].data.fd] = &used_data_[i];
- if (used_data_[i].events & (EPOLLRDHUP | EPOLLERR | EPOLLHUP)) {
- errors_.insert(used_data_[i].data.fd);
- }
}
}
for (auto data : data_) {
result = kevent(kqueuefd_, 0, 0, used_data_.data(), used_data_.size(), select_timeout_p);
for (int i = 0; i < result; ++i) {
map_.emplace(used_data_[i].ident, &used_data_[i]);
- if (used_data_[i].flags & EV_EOF || used_data_[i].filter == EV_ERROR) {
- errors_.insert(used_data_[i].ident);
- }
}
}
for (auto data : data_) {
for (size_t i = 0; i < data_.size(); ++i) {
map_[data_[i].fd] = &data_[i];
}
- int result = poll(data_.data(), data_.size(), timeout);
- for (auto data : data_) {
- if (data.revents & (POLLHUP | POLLERR | POLLNVAL)) {
- return (-1);
- }
- }
- return (result);
+ return (poll(data_.data(), data_.size(), timeout));
}
bool PollEventHandler::readReady(int fd) {
EXPECT_TRUE(handler_->readReady(fd));
EXPECT_EQ(EBADF, errno);
} else if (handler_->type() == FDEventHandler::TYPE_POLL) {
- EXPECT_EQ(-1, handler_->waitEvent(0, 1000));
+ EXPECT_EQ(1, handler_->waitEvent(0, 1000));
EXPECT_FALSE(handler_->readReady(fd));
EXPECT_EQ(0, errno);
} else {
EXPECT_EQ(1, selectCheck(select_fd));
EXPECT_TRUE(watch->isReady());
+ // The epoll event handler must be created before closing the socket.
+ // It creates an internal pipe which will match the closed fd and the
+ // check for bad file descriptor will fail.
+ FDEventHandlerPtr handler = FDEventHandlerFactory::factoryFDEventHandler();
+ bool use_select = FDEventHandlerFactory::factoryFDEventHandler()->type() != FDEventHandler::TYPE_POLL;
+
// Interfere by closing the fd.
ASSERT_EQ(0, close(select_fd));
ASSERT_NO_THROW(watch->clearReady());
// Verify the select_fd fails as socket is invalid/closed.
- ASSERT_EQ(-1, selectCheck(select_fd));
+ if (use_select) {
+ ASSERT_EQ(-1, selectCheck(select_fd));
+ } else {
+ handler->add(select_fd);
+ EXPECT_EQ(1, handler->waitEvent(0, 0));
+ }
// Verify that subsequent attempts to mark it will fail.
ASSERT_THROW(watch->markReady(), WatchSocketError);
EXPECT_TRUE(watch->isReady());
EXPECT_EQ(1, selectCheck(select_fd));
+ // The epoll event handler must be created before closing the socket.
+ // It creates an internal pipe which will match the closed fd and the
+ // check for bad file descriptor will fail.
+ FDEventHandlerPtr handler = FDEventHandlerFactory::factoryFDEventHandler();
+ bool use_select = FDEventHandlerFactory::factoryFDEventHandler()->type() != FDEventHandler::TYPE_POLL;
+
// Interfere by reading the fd. This should empty the read pipe.
uint32_t buf = 0;
ASSERT_EQ((read (select_fd, &buf, 1)), 1);
// Verify the select_fd does not evaluate to ready.
EXPECT_FALSE(watch->isReady());
- EXPECT_EQ(-1, selectCheck(select_fd));
+ if (use_select) {
+ EXPECT_EQ(-1, selectCheck(select_fd));
+ } else {
+ handler->add(select_fd);
+ EXPECT_EQ(1, handler->waitEvent(0, 0));
+ }
// Verify that getSelectFd() returns INVALID.
ASSERT_EQ(WatchSocket::SOCKET_NOT_VALID, watch->getSelectFd());