From 77651dd239f37c5dac85d5c4074dae07ab36cab7 Mon Sep 17 00:00:00 2001 From: alesapin Date: Wed, 25 Nov 2020 23:42:23 +0300 Subject: [PATCH] Don't epoll_create each poll --- src/Server/TestKeeperTCPHandler.cpp | 59 +++++++++++++++++------------ 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/src/Server/TestKeeperTCPHandler.cpp b/src/Server/TestKeeperTCPHandler.cpp index a178b5e43e6..fdff814e6e0 100644 --- a/src/Server/TestKeeperTCPHandler.cpp +++ b/src/Server/TestKeeperTCPHandler.cpp @@ -13,7 +13,6 @@ #include #include - #ifdef POCO_HAVE_FD_EPOLL #include #else @@ -34,6 +33,12 @@ struct SocketInterruptablePollWrapper int sockfd; PipeFDs pipe; +#if defined(POCO_HAVE_FD_EPOLL) + int epollfd; + epoll_event socket_event{}; + epoll_event pipe_event{}; +#endif + enum class PollStatus { HAS_DATA, @@ -48,6 +53,27 @@ struct SocketInterruptablePollWrapper : sockfd(poco_socket_.impl()->sockfd()) { pipe.setNonBlocking(); + +#if defined(POCO_HAVE_FD_EPOLL) + epollfd = epoll_create(2); + if (epollfd < 0) + throwFromErrno("Cannot epoll_create", ErrorCodes::SYSTEM_ERROR); + + socket_event.events = EPOLLIN | EPOLLERR; + socket_event.data.fd = sockfd; + if (epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, &socket_event) < 0) + { + ::close(epollfd); + throwFromErrno("Cannot insert socket into epoll queue", ErrorCodes::SYSTEM_ERROR); + } + pipe_event.events = EPOLLIN | EPOLLERR; + pipe_event.data.fd = pipe.fds_rw[0]; + if (epoll_ctl(epollfd, EPOLL_CTL_ADD, pipe.fds_rw[0], &pipe_event) < 0) + { + ::close(epollfd); + throwFromErrno("Cannot insert socket into epoll queue", ErrorCodes::SYSTEM_ERROR); + } +#endif } int getInterruptFD() const @@ -57,30 +83,7 @@ struct SocketInterruptablePollWrapper PollStatus poll(Poco::Timespan remaining_time) { - #if defined(POCO_HAVE_FD_EPOLL) - int epollfd = epoll_create(2); - - if (epollfd < 0) - throwFromErrno("Cannot epoll_create", ErrorCodes::SYSTEM_ERROR); - - epoll_event socket_event{}; - socket_event.events = EPOLLIN | EPOLLERR; - socket_event.data.fd = sockfd; - if (epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, &socket_event) < 0) - { - ::close(epollfd); - throwFromErrno("Cannot insert socket into epoll queue", ErrorCodes::SYSTEM_ERROR); - } - epoll_event pipe_event{}; - pipe_event.events = EPOLLIN | EPOLLERR; - pipe_event.data.fd = pipe.fds_rw[0]; - if (epoll_ctl(epollfd, EPOLL_CTL_ADD, pipe.fds_rw[0], &pipe_event) < 0) - { - ::close(epollfd); - throwFromErrno("Cannot insert socket into epoll queue", ErrorCodes::SYSTEM_ERROR); - } - int rc; epoll_event evout{}; do @@ -99,7 +102,6 @@ struct SocketInterruptablePollWrapper } while (rc < 0 && errno == EINTR); - ::close(epollfd); int out_fd = evout.data.fd; #else pollfd poll_buf[2]; @@ -143,6 +145,13 @@ struct SocketInterruptablePollWrapper } return PollStatus::HAS_DATA; } + +#if defined(POCO_HAVE_FD_EPOLL) + ~SocketInterruptablePollWrapper() + { + ::close(epollfd); + } +#endif }; TestKeeperTCPHandler::TestKeeperTCPHandler(IServer & server_, const Poco::Net::StreamSocket & socket_)