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