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; }
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; }