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