• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/epoll_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:
Notification(bool value)31   explicit Notification(bool value) : value_(value) {}
32 
Notify()33   void Notify() {
34     base::AutoLock al(lock_);
35     value_ = true;
36   }
HasBeenNotified()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
OnRegistration(EpollServer * eps,int fd,int event_mask)53   virtual void OnRegistration(EpollServer* eps,
54                               int fd,
55                               int event_mask) OVERRIDE {}
OnModification(int fd,int event_mask)56   virtual void OnModification(int fd, int event_mask) OVERRIDE {}
57   virtual void OnEvent(int fd, EpollEvent* event) OVERRIDE;
OnUnregistration(int fd,bool replaced)58   virtual void OnUnregistration(int fd, bool replaced) OVERRIDE {}
OnShutdown(EpollServer * eps,int fd)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.
Quit()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