Example #1
0
// millisecs
std::error_code
PollPoller::poll(int timeout,
                   std::unordered_map<int, Dispatcher *> &active_dispatchers) {

  if (fds_.size() == 0) {
    ::Sleep(timeout);
    return LS_OK_ERROR();
  }
  int num_events = ::WSAPoll(&*fds_.begin(), fds_.size(), timeout);

  if (num_events < 0) {
    if (SOCK_ERRNO() == CERR(EINTR)) {
      return LS_OK_ERROR();
    }
  } else if (num_events == 0) {
    return LS_OK_ERROR();
  } else {
    for (auto it = fds_.begin(); it != fds_.end() && num_events > 0; ++it) {
      if (it->revents > 0) {
        --num_events;
        Dispatcher *dispatcher = dispatchers_[it->fd];
        dispatcher->set_poll_event_data(
            it->revents & (POLLIN | POLLPRI), it->revents & POLLOUT,
            it->revents & POLLERR,
            (it->revents & POLLHUP) && !(it->revents & POLLIN));
        active_dispatchers[dispatcher->get_fd()] = dispatcher;
      }
    }
  }
  return LS_OK_ERROR();
}
Example #2
0
std::error_code
PollPoller::update_dispatcher(Dispatcher &dispatcher) {
  assert(dispatchers_.find(dispatcher.get_fd()) != dispatchers_.end());
  int sock = dispatcher.get_fd();

  struct pollfd &pd = fds_[dispatcher.get_index()];

  pd.events = 0;

  if (dispatcher.readable()) {
    pd.events |= POLLIN;
  }
  if (dispatcher.writable()) {
    pd.events |= POLLOUT;
  }

  return LS_OK_ERROR();
}
Example #3
0
std::error_code
PollPoller::remove_dispatcher(Dispatcher &dispatcher) {
  assert(dispatchers_.find(dispatcher.get_fd()) != dispatchers_.end());

  int sock = dispatcher.get_fd();

  int vec_idx = dispatcher.get_index();
  if (dispatchers_.size() > 1) {
    fds_[vec_idx] = fds_[fds_.size() - 1];
    auto tgt_disp = dispatchers_[fds_[vec_idx].fd];
    tgt_disp->set_index(vec_idx);
    fds_.pop_back();
  } else {
    fds_.clear();
  }

  dispatchers_.erase(dispatcher.get_fd());
  return LS_OK_ERROR();
}
Example #4
0
std::error_code PollPoller::add_dispatcher(Dispatcher &dispatcher) {
  assert(dispatchers_.find(dispatcher.get_fd()) == dispatchers_.end());
  int sock = dispatcher.get_fd();

  struct pollfd pd;

  pd.fd = sock;
  pd.events = 0;

  if (dispatcher.readable()) {
    pd.events |= POLLIN;
  }
  if (dispatcher.writable()) {
    pd.events |= POLLOUT;
  }
  dispatcher.set_index(fds_.size());
  fds_.push_back(pd);

  dispatchers_[dispatcher.get_fd()] = &dispatcher;
  return LS_OK_ERROR();
}
Example #5
0
bool Poller::has_dispathcer(const Dispatcher &dispatcher) const {
  auto res = dispatchers_.find(dispatcher.get_fd());
  return res != dispatchers_.end() && &dispatcher == res->second;
}