X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/6b5e09540e9392a7015fae1ad3b01b0973600ff2..d54215aea2a7321ab0f2dc7b0042fea2b7ff5df5:/rpc/connection.cc diff --git a/rpc/connection.cc b/rpc/connection.cc index e269a3d..358a2af 100644 --- a/rpc/connection.cc +++ b/rpc/connection.cc @@ -214,12 +214,8 @@ tcpsconn::tcpsconn(connection_delegate *m1, in_port_t port, int lossytest) tcp_.setsockopt(SOL_SOCKET, SO_REUSEADDR, (int)1); tcp_.setsockopt(IPPROTO_TCP, TCP_NODELAY, (int)1); - - if (tcp_.setsockopt(SOL_SOCKET, SO_RCVTIMEO, timeval{0, 50000}) < 0) - perror("accept_loop setsockopt"); - - if (tcp_.setsockopt(SOL_SOCKET, SO_SNDTIMEO, timeval{0, 50000}) < 0) - perror("accept_loop setsockopt"); + tcp_.setsockopt(SOL_SOCKET, SO_RCVTIMEO, timeval{0, 50000}); + tcp_.setsockopt(SOL_SOCKET, SO_SNDTIMEO, timeval{0, 50000}); // careful to exactly match type signature of bind arguments so we don't // get std::bind instead @@ -239,23 +235,18 @@ tcpsconn::tcpsconn(connection_delegate *m1, in_port_t port, int lossytest) IF_LEVEL(2) LOG("listen on " << port_ << " " << sin.sin_port); - file_t::pipe(pipe_); - - pipe_[0].flags() |= O_NONBLOCK; - - th_ = thread(&tcpsconn::accept_conn, this); + poll_mgr::shared_mgr.add_callback(tcp_, CB_RDONLY, this); } tcpsconn::~tcpsconn() { - pipe_[1].close(); - th_.join(); + poll_mgr::shared_mgr.block_remove_fd(tcp_); for (auto & i : conns_) i.second->closeconn(); } -void tcpsconn::process_accept() { +void tcpsconn::read_cb(int) { sockaddr_in sin; socklen_t slen = sizeof(sin); int s1 = accept(tcp_, (sockaddr *)&sin, &slen); @@ -277,36 +268,3 @@ void tcpsconn::process_accept() { conns_[ch->channo()] = ch; } - -void tcpsconn::accept_conn() { - fd_set rfds; - int max_fd = max((int)pipe_[0], (int)tcp_); - - while (1) { - FD_ZERO(&rfds); - FD_SET(pipe_[0], &rfds); - FD_SET(tcp_, &rfds); - - int ret = select(max_fd+1, &rfds, NULL, NULL, NULL); - - if (ret < 0 && errno == EINTR) - continue; - else if (ret < 0) { - perror("accept_conn select:"); - IF_LEVEL(0) LOG("accept_conn failure errno " << errno); - VERIFY(0); - } - - if (FD_ISSET(pipe_[0], &rfds)) - return; - - VERIFY(FD_ISSET(tcp_, &rfds)); - - try { - process_accept(); - } catch (thread_exit_exception e) { - break; - } - } -} -