From f7b51f60f5b5ca52d2f21fae0318d36cef5137a0 Mon Sep 17 00:00:00 2001 From: Sergey Yakubov <sergey.yakubov@desy.de> Date: Fri, 8 Mar 2019 15:25:05 +0100 Subject: [PATCH] refactor --- common/cpp/src/system_io/system_io.h | 4 ++ common/cpp/src/system_io/system_io_linux.cpp | 63 ++++++++++--------- .../client_serv_multicon/multicon.cpp | 2 +- 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/common/cpp/src/system_io/system_io.h b/common/cpp/src/system_io/system_io.h index 2bc41c66d..a78b7b736 100644 --- a/common/cpp/src/system_io/system_io.h +++ b/common/cpp/src/system_io/system_io.h @@ -74,6 +74,10 @@ class SystemIO final : public IO { const int kMaxEpollEvents = 10; mutable int epoll_fd_ = -1; Error AddToEpool(SocketDescriptor sd) const; + Error CreateEpoolIfNeeded(SocketDescriptor master_socket) const; + Error ProcessNewConnection(SocketDescriptor master_socket, std::vector<std::string>* new_connections, + ListSocketDescriptors* sockets_to_listen) const; + #endif public: ~SystemIO(); diff --git a/common/cpp/src/system_io/system_io_linux.cpp b/common/cpp/src/system_io/system_io_linux.cpp index 778830af1..a072e2498 100644 --- a/common/cpp/src/system_io/system_io_linux.cpp +++ b/common/cpp/src/system_io/system_io_linux.cpp @@ -303,36 +303,48 @@ Error SystemIO::AddToEpool(SocketDescriptor sd) const { return nullptr; } +Error SystemIO::CreateEpoolIfNeeded(SocketDescriptor master_socket) const { + if (epoll_fd_ != kDisconnectedSocketDescriptor) { + return nullptr; + } + + epoll_fd_ = epoll_create1(0); + if(epoll_fd_ == kDisconnectedSocketDescriptor) { + auto err = GetLastError(); + err->Append("Create epoll"); + return err; + } + return AddToEpool(master_socket); +} + + +Error SystemIO::ProcessNewConnection(SocketDescriptor master_socket, std::vector<std::string>* new_connections, + ListSocketDescriptors* sockets_to_listen) const { + Error err; + auto client_info_tuple = InetAcceptConnection(master_socket, &err); + if (err) { + return err; + } + std::string client_address; + SocketDescriptor client_fd; + std::tie(client_address, client_fd) = *client_info_tuple; + new_connections->emplace_back(std::move(client_address)); + sockets_to_listen->push_back(client_fd); + return AddToEpool(client_fd); +} + ListSocketDescriptors SystemIO::WaitSocketsActivity(SocketDescriptor master_socket, ListSocketDescriptors* sockets_to_listen, std::vector<std::string>* new_connections, Error* err) const { - if (epoll_fd_ == kDisconnectedSocketDescriptor) { - epoll_fd_ = epoll_create1(0); - if(epoll_fd_ == kDisconnectedSocketDescriptor) { - *err = GetLastError(); - (*err)->Append("Create epoll"); - return {}; - } - } - struct epoll_event events[kMaxEpollEvents]; + CreateEpoolIfNeeded(master_socket); - *err = AddToEpool(master_socket); - if (*err) { - return {}; - } - for (auto sd : *sockets_to_listen) { - *err = AddToEpool(sd); - if (*err) { - return {}; - } - } ListSocketDescriptors active_sockets; bool client_activity = false; while (!client_activity) { - + struct epoll_event events[kMaxEpollEvents]; auto event_count = epoll_wait(epoll_fd_, events, kMaxEpollEvents, kWaitTimeoutMs); if (event_count == 0) { // timeout *err = IOErrorTemplates::kTimeout.Generate(); @@ -350,19 +362,10 @@ ListSocketDescriptors SystemIO::WaitSocketsActivity(SocketDescriptor master_sock active_sockets.push_back(sd); client_activity = true; } else { - auto client_info_tuple = InetAcceptConnection(master_socket, err); - if (*err) { - return {}; - } - std::string client_address; - SocketDescriptor client_fd; - std::tie(client_address, client_fd) = *client_info_tuple; - new_connections->emplace_back(std::move(client_address)); - *err = AddToEpool(client_fd); + *err = ProcessNewConnection(master_socket, new_connections, sockets_to_listen); if (*err) { return {}; } - sockets_to_listen->push_back(client_fd); } } } diff --git a/tests/automatic/system_io/ip_tcp_network/client_serv_multicon/multicon.cpp b/tests/automatic/system_io/ip_tcp_network/client_serv_multicon/multicon.cpp index 2440ff2ca..37e5af9be 100644 --- a/tests/automatic/system_io/ip_tcp_network/client_serv_multicon/multicon.cpp +++ b/tests/automatic/system_io/ip_tcp_network/client_serv_multicon/multicon.cpp @@ -59,7 +59,7 @@ std::unique_ptr<std::thread> CreateEchoServerThread() { ExitIfErrIsNotOk(&err, 106); std::cout << "[SERVER] socket closed " << socket << std::endl; sockets_to_listen.erase(std::remove(sockets_to_listen.begin(), sockets_to_listen.end(), socket), - sockets_to_listen.end()); + sockets_to_listen.end()); continue; } ExitIfErrIsNotOk(&err, 104); -- GitLab