int SelectPoll::registerFd(SOCKET_FD fd, uint32_t events, IOCallback& cb) { KUMA_INFOTRACE("SelectPoll::registerFd, fd="<<fd); resizePollItems(fd); if (INVALID_FD == poll_items_[fd].fd || -1 == poll_items_[fd].idx) { PollFD pfd; pfd.fd = fd; pfd.events = events; poll_fds_.push_back(pfd); poll_items_[fd].idx = int(poll_fds_.size() - 1); } poll_items_[fd].fd = fd; poll_items_[fd].cb = cb; updateFdSet(fd, events); return KUMA_ERROR_NOERR; }
KMError KQueue::registerFd(SOCKET_FD fd, uint32_t events, IOCallback cb) { if (fd < 0) { return KMError::INVALID_PARAM; } resizePollItems(fd); struct kevent kevents[2]; int nchanges = 0; if (INVALID_FD != poll_items_[fd].fd) { if (!!(poll_items_[fd].events & KUMA_EV_READ) && !(events & KUMA_EV_READ)) { EV_SET(&kevents[nchanges++], fd, EVFILT_READ, EV_DELETE, 0, 0, 0); poll_items_[fd].events &= ~KUMA_EV_READ; } if (!!(poll_items_[fd].events & KUMA_EV_WRITE) && !(events & KUMA_EV_WRITE)) { EV_SET(&kevents[nchanges++], fd, EVFILT_WRITE, EV_DELETE, 0, 0, 0); poll_items_[fd].events &= ~KUMA_EV_WRITE; } ::kevent(kqueue_fd_, kevents, nchanges, 0, 0, 0); if (poll_items_[fd].events == events) { poll_items_[fd].cb = std::move(cb); return KMError::NOERR; } } nchanges = 0; unsigned short op = EV_ADD; if (work_on_et_mode_) { op |= EV_CLEAR; } if (events & KUMA_EV_READ) { EV_SET(&kevents[nchanges++], fd, EVFILT_READ, op , 0, 0, 0); } if (events & KUMA_EV_WRITE) { EV_SET(&kevents[nchanges++], fd, EVFILT_WRITE, op , 0, 0, 0); } poll_items_[fd].fd = fd; poll_items_[fd].events = events; poll_items_[fd].cb = std::move(cb); if(::kevent(kqueue_fd_, kevents, nchanges, 0, 0, 0) == -1) { KUMA_ERRTRACE("KQueue::registerFd error, fd=" << fd << ", ev=" << events << ", errno=" << errno); return KMError::FAILED; } KUMA_INFOTRACE("KQueue::registerFd, fd=" << fd << ", ev=" << events); return KMError::NOERR; }
int EPoll::registerFd(SOCKET_FD fd, uint32_t events, IOCallback&& cb) { resizePollItems(fd); int epoll_op = EPOLL_CTL_ADD; if (INVALID_FD != poll_items_[fd].fd) { epoll_op = EPOLL_CTL_MOD; } poll_items_[fd].fd = fd; poll_items_[fd].cb = std::move(cb); struct epoll_event evt = {0}; evt.data.ptr = (void*)(long)fd; evt.events = get_events(events);//EPOLLIN | EPOLLOUT | EPOLLERR | EPOLLHUP | EPOLLET; if(epoll_ctl(epoll_fd_, epoll_op, fd, &evt) < 0) { KUMA_ERRTRACE("EPoll::registerFd error, fd=" << fd << ", ev=" << evt.events << ", errno=" << errno); return KUMA_ERROR_FAILED; } KUMA_INFOTRACE("EPoll::registerFd, fd=" << fd << ", ev=" << evt.events); return KUMA_ERROR_NOERR; }
KMError VPoll::registerFd(SOCKET_FD fd, KMEvent events, IOCallback cb) { if (fd < 0) { return KMError::INVALID_PARAM; } resizePollItems(fd); int idx = -1; if (INVALID_FD == poll_items_[fd].fd || -1 == poll_items_[fd].idx) { // new pollfd pfd; pfd.fd = fd; pfd.events = get_events(events); poll_fds_.push_back(pfd); idx = int(poll_fds_.size() - 1); poll_items_[fd].idx = idx; } poll_items_[fd].fd = fd; poll_items_[fd].events = events; poll_items_[fd].cb = std::move(cb); KUMA_INFOTRACE("VPoll::registerFd, fd="<<fd<<", events="<<events<<", index="<<idx); return KMError::NOERR; }