int SelectPoll::unregisterFd(SOCKET_FD fd) { KUMA_INFOTRACE("SelectPoll::unregisterFd, fd="<<fd); int max_fd = int(poll_items_.size() - 1); if (fd < 0 || fd > max_fd) { KUMA_WARNTRACE("SelectPoll::unregisterFd, failed, max_fd=" << max_fd); return KUMA_ERROR_INVALID_PARAM; } updateFdSet(fd, 0); int idx = poll_items_[fd].idx; if (fd == max_fd) { poll_items_.pop_back(); } else { poll_items_[fd].fd = INVALID_FD; poll_items_[fd].cb = nullptr; poll_items_[fd].idx = -1; } int last_idx = int(poll_fds_.size() - 1); if (idx > last_idx || -1 == idx) { return KUMA_ERROR_NOERR; } if (idx != last_idx) { std::iter_swap(poll_fds_.begin() + idx, poll_fds_.end() - 1); poll_items_[poll_fds_[idx].fd].idx = idx; } poll_fds_.pop_back(); return KUMA_ERROR_NOERR; }
void SelectPoll::updateFdSet(SOCKET_FD fd, uint32_t events) { if(events != 0) { if (events & KUMA_EV_READ) { FD_SET(fd, &read_fds_); } else { FD_CLR(fd, &read_fds_); } if (events & KUMA_EV_WRITE) { FD_SET(fd, &write_fds_); } else { FD_CLR(fd, &write_fds_); } if (events & KUMA_EV_ERROR) { FD_SET(fd, &except_fds_); } if (fd > max_fd_) { max_fd_ = fd; } } else { FD_CLR(fd, &read_fds_); FD_CLR(fd, &write_fds_); FD_CLR(fd, &except_fds_); if(max_fd_ == fd) { auto it = std::max_element(poll_fds_.begin(), poll_fds_.end(), [] (PollFD& pf1, PollFD& pf2){ return pf1.fd < pf2.fd; }); max_fd_ = it != poll_fds_.end()?(*it).fd:0; } } }
KMError VPoll::unregisterFd(SOCKET_FD fd) { int max_fd = int(poll_items_.size() - 1); KUMA_INFOTRACE("VPoll::unregisterFd, fd="<<fd<<", max_fd="<<max_fd); if (fd < 0 || -1 == max_fd || fd > max_fd) { KUMA_WARNTRACE("VPoll::unregisterFd, failed, max_fd="<<max_fd); return KMError::INVALID_PARAM; } int idx = poll_items_[fd].idx; if(fd < max_fd) { poll_items_[fd].reset(); } else if (fd == max_fd) { poll_items_.pop_back(); } int last_idx = int(poll_fds_.size() - 1); if (idx > last_idx || -1 == idx) { return KMError::NOERR; } if (idx != last_idx) { std::iter_swap(poll_fds_.begin()+idx, poll_fds_.end()-1); poll_items_[poll_fds_[idx].fd].idx = idx; } poll_fds_.pop_back(); return KMError::NOERR; }