Index: net/tools/flip_server/acceptor_thread.cc |
diff --git a/net/tools/flip_server/acceptor_thread.cc b/net/tools/flip_server/acceptor_thread.cc |
deleted file mode 100644 |
index 22b94f3e53e83a2d89320a4b627f007bccdaa445..0000000000000000000000000000000000000000 |
--- a/net/tools/flip_server/acceptor_thread.cc |
+++ /dev/null |
@@ -1,206 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/tools/flip_server/acceptor_thread.h" |
- |
-#include <errno.h> |
-#include <netinet/in.h> |
-#include <string.h> // For strerror |
-#include <sys/socket.h> |
-#include <sys/types.h> |
- |
-#include <string> |
- |
-#include "net/socket/tcp_socket.h" |
-#include "net/tools/flip_server/constants.h" |
-#include "net/tools/flip_server/flip_config.h" |
-#include "net/tools/flip_server/sm_connection.h" |
-#include "net/tools/flip_server/spdy_ssl.h" |
-#include "openssl/err.h" |
-#include "openssl/ssl.h" |
- |
-namespace net { |
- |
-SMAcceptorThread::SMAcceptorThread(FlipAcceptor* acceptor, |
- MemoryCache* memory_cache) |
- : SimpleThread("SMAcceptorThread"), |
- acceptor_(acceptor), |
- ssl_state_(NULL), |
- use_ssl_(false), |
- idle_socket_timeout_s_(acceptor->idle_socket_timeout_s_), |
- quitting_(false), |
- memory_cache_(memory_cache) { |
- if (!acceptor->ssl_cert_filename_.empty() && |
- !acceptor->ssl_key_filename_.empty()) { |
- ssl_state_ = new SSLState; |
- bool use_npn = true; |
- if (acceptor_->flip_handler_type_ == FLIP_HANDLER_HTTP_SERVER) { |
- use_npn = false; |
- } |
- InitSSL(ssl_state_, |
- acceptor_->ssl_cert_filename_, |
- acceptor_->ssl_key_filename_, |
- use_npn, |
- acceptor_->ssl_session_expiry_, |
- acceptor_->ssl_disable_compression_); |
- use_ssl_ = true; |
- } |
-} |
- |
-SMAcceptorThread::~SMAcceptorThread() { |
- for (std::vector<SMConnection*>::iterator i = |
- allocated_server_connections_.begin(); |
- i != allocated_server_connections_.end(); |
- ++i) { |
- delete *i; |
- } |
- delete ssl_state_; |
-} |
- |
-SMConnection* SMAcceptorThread::NewConnection() { |
- SMConnection* server = SMConnection::NewSMConnection( |
- &epoll_server_, ssl_state_, memory_cache_, acceptor_, "client_conn: "); |
- allocated_server_connections_.push_back(server); |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "Acceptor: Making new server."; |
- return server; |
-} |
- |
-SMConnection* SMAcceptorThread::FindOrMakeNewSMConnection() { |
- if (unused_server_connections_.empty()) { |
- return NewConnection(); |
- } |
- SMConnection* server = unused_server_connections_.back(); |
- unused_server_connections_.pop_back(); |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT << "Acceptor: Reusing server."; |
- return server; |
-} |
- |
-void SMAcceptorThread::InitWorker() { |
- epoll_server_.RegisterFD(acceptor_->listen_fd_, this, EPOLLIN | EPOLLET); |
-} |
- |
-void SMAcceptorThread::HandleConnection(int server_fd, |
- struct sockaddr_in* remote_addr) { |
- if (acceptor_->disable_nagle_) { |
- if (!SetTCPNoDelay(server_fd, /*no_delay=*/true)) { |
- close(server_fd); |
- LOG(FATAL) << "SetTCPNoDelay() failed on fd: " << server_fd; |
- return; |
- } |
- } |
- |
- SMConnection* server_connection = FindOrMakeNewSMConnection(); |
- if (server_connection == NULL) { |
- VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Acceptor: Closing fd " << server_fd; |
- close(server_fd); |
- return; |
- } |
- std::string remote_ip = inet_ntoa(remote_addr->sin_addr); |
- server_connection->InitSMConnection(this, |
- NULL, |
- &epoll_server_, |
- server_fd, |
- std::string(), |
- std::string(), |
- remote_ip, |
- use_ssl_); |
- if (server_connection->initialized()) |
- active_server_connections_.push_back(server_connection); |
-} |
- |
-void SMAcceptorThread::AcceptFromListenFD() { |
- if (acceptor_->accepts_per_wake_ > 0) { |
- for (int i = 0; i < acceptor_->accepts_per_wake_; ++i) { |
- struct sockaddr address; |
- socklen_t socklen = sizeof(address); |
- int fd = accept(acceptor_->listen_fd_, &address, &socklen); |
- if (fd == -1) { |
- if (errno != 11) { |
- VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Acceptor: accept fail(" |
- << acceptor_->listen_fd_ << "): " << errno << ": " |
- << strerror(errno); |
- } |
- break; |
- } |
- VLOG(1) << ACCEPTOR_CLIENT_IDENT << " Accepted connection"; |
- HandleConnection(fd, (struct sockaddr_in*)&address); |
- } |
- } else { |
- while (true) { |
- struct sockaddr address; |
- socklen_t socklen = sizeof(address); |
- int fd = accept(acceptor_->listen_fd_, &address, &socklen); |
- if (fd == -1) { |
- if (errno != 11) { |
- VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Acceptor: accept fail(" |
- << acceptor_->listen_fd_ << "): " << errno << ": " |
- << strerror(errno); |
- } |
- break; |
- } |
- VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Accepted connection"; |
- HandleConnection(fd, (struct sockaddr_in*)&address); |
- } |
- } |
-} |
- |
-void SMAcceptorThread::HandleConnectionIdleTimeout() { |
- static time_t oldest_time = time(NULL); |
- |
- int cur_time = time(NULL); |
- // Only iterate the list if we speculate that a connection is ready to be |
- // expired |
- if ((cur_time - oldest_time) < idle_socket_timeout_s_) |
- return; |
- |
- // TODO(mbelshe): This code could be optimized, active_server_connections_ |
- // is already in-order. |
- std::list<SMConnection*>::iterator iter = active_server_connections_.begin(); |
- while (iter != active_server_connections_.end()) { |
- SMConnection* conn = *iter; |
- int elapsed_time = (cur_time - conn->last_read_time_); |
- if (elapsed_time > idle_socket_timeout_s_) { |
- conn->Cleanup("Connection idle timeout reached."); |
- iter = active_server_connections_.erase(iter); |
- continue; |
- } |
- if (conn->last_read_time_ < oldest_time) |
- oldest_time = conn->last_read_time_; |
- iter++; |
- } |
- if ((cur_time - oldest_time) >= idle_socket_timeout_s_) |
- oldest_time = cur_time; |
-} |
- |
-void SMAcceptorThread::Run() { |
- while (!quitting_.HasBeenNotified()) { |
- epoll_server_.set_timeout_in_us(10 * 1000); // 10 ms |
- epoll_server_.WaitForEventsAndExecuteCallbacks(); |
- if (tmp_unused_server_connections_.size()) { |
- VLOG(2) << "have " << tmp_unused_server_connections_.size() |
- << " additional unused connections. Total = " |
- << unused_server_connections_.size(); |
- unused_server_connections_.insert(unused_server_connections_.end(), |
- tmp_unused_server_connections_.begin(), |
- tmp_unused_server_connections_.end()); |
- tmp_unused_server_connections_.clear(); |
- } |
- HandleConnectionIdleTimeout(); |
- } |
-} |
- |
-void SMAcceptorThread::OnEvent(int fd, EpollEvent* event) { |
- if (event->in_events | EPOLLIN) { |
- VLOG(2) << ACCEPTOR_CLIENT_IDENT |
- << "Acceptor: Accepting based upon epoll events"; |
- AcceptFromListenFD(); |
- } |
-} |
- |
-void SMAcceptorThread::SMConnectionDone(SMConnection* sc) { |
- VLOG(1) << ACCEPTOR_CLIENT_IDENT << "Done with connection."; |
- tmp_unused_server_connections_.push_back(sc); |
-} |
- |
-} // namespace net |