Epoll: use NativeFd
GitOrigin-RevId: a4ff097abcf03cc7ac3a918969762c1539a19644
This commit is contained in:
parent
115fba770f
commit
bc1e26779f
@ -19,24 +19,23 @@ char disable_linker_warning_about_empty_file_epoll_cpp TD_UNUSED;
|
|||||||
namespace td {
|
namespace td {
|
||||||
namespace detail {
|
namespace detail {
|
||||||
void Epoll::init() {
|
void Epoll::init() {
|
||||||
CHECK(epoll_fd == -1);
|
CHECK(!epoll_fd_);
|
||||||
epoll_fd = epoll_create(1);
|
epoll_fd_ = NativeFd(epoll_create(1));
|
||||||
auto epoll_create_errno = errno;
|
auto epoll_create_errno = errno;
|
||||||
LOG_IF(FATAL, epoll_fd == -1) << Status::PosixError(epoll_create_errno, "epoll_create failed");
|
LOG_IF(FATAL, !epoll_fd_) << Status::PosixError(epoll_create_errno, "epoll_create failed");
|
||||||
|
|
||||||
events.resize(1000);
|
events_.resize(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Epoll::clear() {
|
void Epoll::clear() {
|
||||||
if (epoll_fd == -1) {
|
if (!epoll_fd_) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
events.clear();
|
events_.clear();
|
||||||
|
|
||||||
close(epoll_fd);
|
epoll_fd_.close();
|
||||||
epoll_fd = -1;
|
|
||||||
|
|
||||||
for (auto *list_node = list_root.next; list_node != &list_root;) {
|
for (auto *list_node = list_root_.next; list_node != &list_root_;) {
|
||||||
auto pollable_fd = PollableFd::from_list_node(list_node);
|
auto pollable_fd = PollableFd::from_list_node(list_node);
|
||||||
list_node = list_node->next;
|
list_node = list_node->next;
|
||||||
}
|
}
|
||||||
@ -56,22 +55,22 @@ void Epoll::subscribe(PollableFd fd, PollFlags flags) {
|
|||||||
}
|
}
|
||||||
auto native_fd = fd.native_fd().fd();
|
auto native_fd = fd.native_fd().fd();
|
||||||
auto *list_node = fd.release_as_list_node();
|
auto *list_node = fd.release_as_list_node();
|
||||||
list_root.put(list_node);
|
list_root_.put(list_node);
|
||||||
event.data.ptr = list_node;
|
event.data.ptr = list_node;
|
||||||
|
|
||||||
int err = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, native_fd, &event);
|
int err = epoll_ctl(epoll_fd_.fd(), EPOLL_CTL_ADD, native_fd, &event);
|
||||||
auto epoll_ctl_errno = errno;
|
auto epoll_ctl_errno = errno;
|
||||||
LOG_IF(FATAL, err == -1) << Status::PosixError(epoll_ctl_errno, "epoll_ctl ADD failed") << ", epoll_fd = " << epoll_fd
|
LOG_IF(FATAL, err == -1) << Status::PosixError(epoll_ctl_errno, "epoll_ctl ADD failed")
|
||||||
<< ", fd = " << native_fd;
|
<< ", epoll_fd = " << epoll_fd_.fd() << ", fd = " << native_fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Epoll::unsubscribe(PollableFdRef fd_ref) {
|
void Epoll::unsubscribe(PollableFdRef fd_ref) {
|
||||||
auto fd = fd_ref.lock();
|
auto fd = fd_ref.lock();
|
||||||
auto native_fd = fd.native_fd().fd();
|
auto native_fd = fd.native_fd().fd();
|
||||||
int err = epoll_ctl(epoll_fd, EPOLL_CTL_DEL, native_fd, nullptr);
|
int err = epoll_ctl(epoll_fd_.fd(), EPOLL_CTL_DEL, native_fd, nullptr);
|
||||||
auto epoll_ctl_errno = errno;
|
auto epoll_ctl_errno = errno;
|
||||||
LOG_IF(FATAL, err == -1) << Status::PosixError(epoll_ctl_errno, "epoll_ctl DEL failed") << ", epoll_fd = " << epoll_fd
|
LOG_IF(FATAL, err == -1) << Status::PosixError(epoll_ctl_errno, "epoll_ctl DEL failed")
|
||||||
<< ", fd = " << native_fd << fd.native_fd().validate();
|
<< ", epoll_fd = " << epoll_fd_.fd() << ", fd = " << native_fd << fd.native_fd().validate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Epoll::unsubscribe_before_close(PollableFdRef fd) {
|
void Epoll::unsubscribe_before_close(PollableFdRef fd) {
|
||||||
@ -79,14 +78,14 @@ void Epoll::unsubscribe_before_close(PollableFdRef fd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Epoll::run(int timeout_ms) {
|
void Epoll::run(int timeout_ms) {
|
||||||
int ready_n = epoll_wait(epoll_fd, &events[0], static_cast<int>(events.size()), timeout_ms);
|
int ready_n = epoll_wait(epoll_fd_.fd(), &events_[0], static_cast<int>(events_.size()), timeout_ms);
|
||||||
auto epoll_wait_errno = errno;
|
auto epoll_wait_errno = errno;
|
||||||
LOG_IF(FATAL, ready_n == -1 && epoll_wait_errno != EINTR)
|
LOG_IF(FATAL, ready_n == -1 && epoll_wait_errno != EINTR)
|
||||||
<< Status::PosixError(epoll_wait_errno, "epoll_wait failed");
|
<< Status::PosixError(epoll_wait_errno, "epoll_wait failed");
|
||||||
|
|
||||||
for (int i = 0; i < ready_n; i++) {
|
for (int i = 0; i < ready_n; i++) {
|
||||||
PollFlags flags;
|
PollFlags flags;
|
||||||
epoll_event *event = &events[i];
|
epoll_event *event = &events_[i];
|
||||||
if (event->events & EPOLLIN) {
|
if (event->events & EPOLLIN) {
|
||||||
event->events &= ~EPOLLIN;
|
event->events &= ~EPOLLIN;
|
||||||
flags = flags | PollFlags::Read();
|
flags = flags | PollFlags::Read();
|
||||||
|
@ -47,9 +47,9 @@ class Epoll final : public PollBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int epoll_fd = -1;
|
NativeFd epoll_fd_;
|
||||||
vector<struct epoll_event> events;
|
vector<struct epoll_event> events_;
|
||||||
ListNode list_root;
|
ListNode list_root_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
Loading…
Reference in New Issue
Block a user