• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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 #include "net/tools/quic/test_tools/server_thread.h"
6 
7 #include "net/tools/quic/test_tools/quic_server_peer.h"
8 
9 namespace net {
10 namespace tools {
11 namespace test {
12 
ServerThread(QuicServer * server,IPEndPoint address,bool strike_register_no_startup_period)13 ServerThread::ServerThread(QuicServer* server,
14                            IPEndPoint address,
15                            bool strike_register_no_startup_period)
16     : SimpleThread("server_thread"),
17       confirmed_(true, false),
18       pause_(true, false),
19       paused_(true, false),
20       resume_(true, false),
21       quit_(true, false),
22       server_(server),
23       address_(address),
24       port_(0),
25       initialized_(false) {
26   if (strike_register_no_startup_period) {
27     server_->SetStrikeRegisterNoStartupPeriod();
28   }
29 }
30 
~ServerThread()31 ServerThread::~ServerThread() {}
32 
Initialize()33 void ServerThread::Initialize() {
34   if (initialized_) {
35     return;
36   }
37 
38   server_->Listen(address_);
39 
40   port_lock_.Acquire();
41   port_ = server_->port();
42   port_lock_.Release();
43 
44   initialized_ = true;
45 }
46 
Run()47 void ServerThread::Run() {
48   if (!initialized_) {
49     Initialize();
50   }
51 
52   while (!quit_.IsSignaled()) {
53     if (pause_.IsSignaled() && !resume_.IsSignaled()) {
54       paused_.Signal();
55       resume_.Wait();
56     }
57     server_->WaitForEvents();
58     MaybeNotifyOfHandshakeConfirmation();
59   }
60 
61   server_->Shutdown();
62 }
63 
GetPort()64 int ServerThread::GetPort() {
65   port_lock_.Acquire();
66   int rc = port_;
67   port_lock_.Release();
68   return rc;
69 }
70 
WaitForCryptoHandshakeConfirmed()71 void ServerThread::WaitForCryptoHandshakeConfirmed() {
72   confirmed_.Wait();
73 }
74 
Pause()75 void ServerThread::Pause() {
76   DCHECK(!pause_.IsSignaled());
77   pause_.Signal();
78   paused_.Wait();
79 }
80 
Resume()81 void ServerThread::Resume() {
82   DCHECK(!resume_.IsSignaled());
83   DCHECK(pause_.IsSignaled());
84   resume_.Signal();
85 }
86 
Quit()87 void ServerThread::Quit() {
88   if (pause_.IsSignaled() && !resume_.IsSignaled()) {
89     resume_.Signal();
90   }
91   quit_.Signal();
92 }
93 
MaybeNotifyOfHandshakeConfirmation()94 void ServerThread::MaybeNotifyOfHandshakeConfirmation() {
95   if (confirmed_.IsSignaled()) {
96     // Only notify once.
97     return;
98   }
99   QuicDispatcher* dispatcher = QuicServerPeer::GetDispatcher(server());
100   if (dispatcher->session_map().empty()) {
101     // Wait for a session to be created.
102     return;
103   }
104   QuicSession* session = dispatcher->session_map().begin()->second;
105   if (session->IsCryptoHandshakeConfirmed()) {
106     confirmed_.Signal();
107   }
108 }
109 
110 }  // namespace test
111 }  // namespace tools
112 }  // namespace net
113