server_thread.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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
9namespace net {
10namespace tools {
11namespace test {
12
13ServerThread::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
31ServerThread::~ServerThread() {}
32
33void 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
47void 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
64int ServerThread::GetPort() {
65  port_lock_.Acquire();
66  int rc = port_;
67  port_lock_.Release();
68  return rc;
69}
70
71void ServerThread::WaitForCryptoHandshakeConfirmed() {
72  confirmed_.Wait();
73}
74
75void ServerThread::Pause() {
76  DCHECK(!pause_.IsSignaled());
77  pause_.Signal();
78  paused_.Wait();
79}
80
81void ServerThread::Resume() {
82  DCHECK(!resume_.IsSignaled());
83  DCHECK(pause_.IsSignaled());
84  resume_.Signal();
85}
86
87void ServerThread::Quit() {
88  if (pause_.IsSignaled() && !resume_.IsSignaled()) {
89    resume_.Signal();
90  }
91  quit_.Signal();
92}
93
94void 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