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)