server_thread.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/tools/quic/test_tools/server_thread.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/tools/quic/test_tools/quic_server_peer.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace net { 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace tools { 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test { 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochServerThread::ServerThread(IPEndPoint address, 14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const QuicConfig& config, 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const QuicVersionVector& supported_versions, 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool strike_register_no_startup_period) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : SimpleThread("server_thread"), 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) confirmed_(true, false), 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pause_(true, false), 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paused_(true, false), 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resume_(true, false), 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) quit_(true, false), 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_(config, supported_versions), 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) address_(address), 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci port_(0), 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) initialized_(false) { 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (strike_register_no_startup_period) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_.SetStrikeRegisterNoStartupPeriod(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ServerThread::~ServerThread() {} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ServerThread::Initialize() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (initialized_) { 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_.Listen(address_); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) port_lock_.Acquire(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) port_ = server_.port(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) port_lock_.Release(); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) initialized_ = true; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ServerThread::Run() { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!initialized_) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Initialize(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch while (!quit_.IsSignaled()) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pause_.IsSignaled() && !resume_.IsSignaled()) { 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paused_.Signal(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resume_.Wait(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) server_.WaitForEvents(); 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MaybeNotifyOfHandshakeConfirmation(); 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_.Shutdown(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ServerThread::GetPort() { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) port_lock_.Acquire(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc = port_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) port_lock_.Release(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rc; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ServerThread::WaitForCryptoHandshakeConfirmed() { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) confirmed_.Wait(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ServerThread::Pause() { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!pause_.IsSignaled()); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pause_.Signal(); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paused_.Wait(); 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ServerThread::Resume() { 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(!resume_.IsSignaled()); 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(pause_.IsSignaled()); 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resume_.Signal(); 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ServerThread::Quit() { 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (pause_.IsSignaled() && !resume_.IsSignaled()) { 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resume_.Signal(); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch quit_.Signal(); 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ServerThread::MaybeNotifyOfHandshakeConfirmation() { 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (confirmed_.IsSignaled()) { 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Only notify once. 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicDispatcher* dispatcher = QuicServerPeer::GetDispatcher(server()); 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (dispatcher->session_map().empty()) { 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Wait for a session to be created. 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicSession* session = dispatcher->session_map().begin()->second; 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (session->IsCryptoHandshakeConfirmed()) { 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch confirmed_.Signal(); 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace test 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace tools 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace net 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)