}
d_inrun = true;
+ int count = 0;
for (int n = 0; n < ret; ++n) {
if ((fds.at(n).revents & POLLIN) || (fds.at(n).revents & POLLERR) || (fds.at(n).revents & POLLHUP)) {
const auto& iter = d_readCallbacks.find(fds.at(n).fd);
if (iter != d_readCallbacks.end()) {
iter->d_callback(iter->d_fd, iter->d_parameter);
+ count++;
}
}
const auto& iter = d_writeCallbacks.find(fds.at(n).fd);
if (iter != d_writeCallbacks.end()) {
iter->d_callback(iter->d_fd, iter->d_parameter);
+ count++;
}
}
}
d_inrun = false;
- return ret;
+ return count;
}
#if 0
}
d_inrun = true;
+ int count = 0;
for (int n = 0; n < ret; ++n) {
if ((d_eevents[n].events & EPOLLIN) || (d_eevents[n].events & EPOLLERR) || (d_eevents[n].events & EPOLLHUP)) {
const auto& iter = d_readCallbacks.find(d_eevents[n].data.fd);
if (iter != d_readCallbacks.end()) {
iter->d_callback(iter->d_fd, iter->d_parameter);
+ count++;
}
}
const auto& iter = d_writeCallbacks.find(d_eevents[n].data.fd);
if (iter != d_writeCallbacks.end()) {
iter->d_callback(iter->d_fd, iter->d_parameter);
+ count++;
}
}
}
d_inrun = false;
- return ret;
+ return count;
}
#if 0
/* tv will be updated to 'now' before run returns */
/* timeout is in ms */
/* returns 0 on timeout, -1 in case of error (but all implementations
- actually throw in that case) and the number of ready events otherwise */
+ actually throw in that case) and the number of ready events otherwise.
+ Note that We might have two events (read AND write) for the same descriptor */
virtual int run(struct timeval* tv, int timeout = 500) = 0;
/* timeout is in ms, 0 will return immediately, -1 will block until at least one FD is ready */
}
d_inrun = true;
-
+ int count = 0;
for (const auto& pollfd : pollfds) {
-
if (pollfd.revents & POLLIN || pollfd.revents & POLLERR || pollfd.revents & POLLHUP) {
const auto& iter = d_readCallbacks.find(pollfd.fd);
if (iter != d_readCallbacks.end()) {
iter->d_callback(iter->d_fd, iter->d_parameter);
+ count++;
}
}
const auto& iter = d_writeCallbacks.find(pollfd.fd);
if (iter != d_writeCallbacks.end()) {
iter->d_callback(iter->d_fd, iter->d_parameter);
+ count++;
}
}
}
d_inrun = false;
- return ret;
+ return count;
}
#if 0
}
d_inrun = true;
-
+ int count = 0;
for (unsigned int n = 0; n < numevents; ++n) {
if (d_pevents[n].portev_events & POLLIN || d_pevents[n].portev_events & POLLERR || d_pevents[n].portev_events & POLLHUP) {
const auto& iter = d_readCallbacks.find(d_pevents[n].portev_object);
if (iter != d_readCallbacks.end()) {
iter->d_callback(iter->d_fd, iter->d_parameter);
+ count++;
if (d_readCallbacks.count(d_pevents[n].portev_object) && port_associate(d_portfd, PORT_SOURCE_FD, d_pevents[n].portev_object, d_writeCallbacks.count(d_pevents[n].portev_object) ? POLLIN | POLLOUT : POLLIN, 0) < 0) {
throw FDMultiplexerException("Unable to add fd back to ports (read): " + stringerror());
}
const auto& iter = d_writeCallbacks.find(d_pevents[n].portev_object);
if (iter != d_writeCallbacks.end()) {
iter->d_callback(iter->d_fd, iter->d_parameter);
+ count++;
if (d_writeCallbacks.count(d_pevents[n].portev_object) && port_associate(d_portfd, PORT_SOURCE_FD, d_pevents[n].portev_object, d_readCallbacks.count(d_pevents[n].portev_object) ? POLLIN | POLLOUT : POLLOUT, 0) < 0) {
throw FDMultiplexerException("Unable to add fd back to ports (write): " + stringerror());
}
}
d_inrun = false;
- return numevents;
+ return count;
}
#if 0
BOOST_CHECK_EQUAL(readyFDs.at(0), sockets[0]);
auto ready = mplexer->run(&now, 100);
- BOOST_CHECK_EQUAL(ready, 1);
+ BOOST_CHECK_EQUAL(ready, 2);
BOOST_CHECK_EQUAL(readCBCalled, true);
BOOST_CHECK_EQUAL(writeCBCalled, true);