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