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