1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be 3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file. 4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#ifndef NET_TOOLS_FLIP_SERVER_ACCEPTOR_THREAD_H_ 6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define NET_TOOLS_FLIP_SERVER_ACCEPTOR_THREAD_H_ 7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <list> 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <string> 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <vector> 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/threading/simple_thread.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/epoll_server.h" 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/sm_interface.h" 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "openssl/ssl.h" 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstruct sockaddr_in; 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace net { 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass FlipAcceptor; 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass MemoryCache; 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass SMConnection; 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstruct SSLState; 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// TODO(mbelshe): Get rid of this class; we don't need a lock just to set 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// a bool cross threads - especially one which only is set once... 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass Notification { 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public: 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen explicit Notification(bool value) : value_(value) {} 31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void Notify() { 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen base::AutoLock al(lock_); 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen value_ = true; 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool HasBeenNotified() { 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen base::AutoLock al(lock_); 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return value_; 39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool value_; 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen base::Lock lock_; 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass SMAcceptorThread : public base::SimpleThread, 45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public EpollCallbackInterface, 46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public SMConnectionPoolInterface { 47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public: 48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SMAcceptorThread(FlipAcceptor *acceptor, MemoryCache* memory_cache); 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ~SMAcceptorThread(); 50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // EpollCallbackInteface interface 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void OnRegistration(EpollServer* eps, int fd, int event_mask) {} 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void OnModification(int fd, int event_mask) {} 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void OnEvent(int fd, EpollEvent* event); 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void OnUnregistration(int fd, bool replaced) {} 56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void OnShutdown(EpollServer* eps, int fd) {} 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // SMConnectionPool interface 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void SMConnectionDone(SMConnection* sc); 60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // TODO(mbelshe): figure out if we can move these to private functions. 62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SMConnection* NewConnection(); 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SMConnection* FindOrMakeNewSMConnection(); 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void InitWorker(); 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void HandleConnection(int server_fd, struct sockaddr_in *remote_addr); 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void AcceptFromListenFD(); 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Notify the Accept thread that it is time to terminate. 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void Quit() { quitting_.Notify(); } 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Iterates through a list of active connections expiring any that have been 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // idle longer than the configured timeout. 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void HandleConnectionIdleTimeout(); 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void Run(); 76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private: 78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EpollServer epoll_server_; 79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen FlipAcceptor* acceptor_; 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SSLState* ssl_state_; 81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool use_ssl_; 82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int idle_socket_timeout_s_; 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::vector<SMConnection*> unused_server_connections_; 85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::vector<SMConnection*> tmp_unused_server_connections_; 86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::vector<SMConnection*> allocated_server_connections_; 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::list<SMConnection*> active_server_connections_; 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Notification quitting_; 89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen MemoryCache* memory_cache_; 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} // namespace net 93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif // NET_TOOLS_FLIP_SERVER_ACCEPTOR_THREAD_H_ 95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 96