| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "net/third_party/quiche/src/quic/test_tools/simulator/alarm_factory.h" | 
 |  | 
 | #include "net/third_party/quiche/src/quic/core/quic_alarm.h" | 
 | #include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h" | 
 |  | 
 | namespace quic { | 
 | namespace simulator { | 
 |  | 
 | // Alarm is an implementation of QuicAlarm which can schedule alarms in the | 
 | // simulation timeline. | 
 | class Alarm : public QuicAlarm { | 
 |  public: | 
 |   Alarm(Simulator* simulator, | 
 |         std::string name, | 
 |         QuicArenaScopedPtr<QuicAlarm::Delegate> delegate) | 
 |       : QuicAlarm(std::move(delegate)), adapter_(simulator, name, this) {} | 
 |   ~Alarm() override {} | 
 |  | 
 |   void SetImpl() override { | 
 |     DCHECK(deadline().IsInitialized()); | 
 |     adapter_.Set(deadline()); | 
 |   } | 
 |  | 
 |   void CancelImpl() override { adapter_.Cancel(); } | 
 |  | 
 |  private: | 
 |   // An adapter class triggering a QuicAlarm using a simulation time system. | 
 |   // An adapter is required here because neither Actor nor QuicAlarm are pure | 
 |   // interfaces. | 
 |   class Adapter : public Actor { | 
 |    public: | 
 |     Adapter(Simulator* simulator, std::string name, Alarm* parent) | 
 |         : Actor(simulator, name), parent_(parent) {} | 
 |     ~Adapter() override {} | 
 |  | 
 |     void Set(QuicTime time) { Schedule(std::max(time, clock_->Now())); } | 
 |     void Cancel() { Unschedule(); } | 
 |  | 
 |     void Act() override { | 
 |       DCHECK(clock_->Now() >= parent_->deadline()); | 
 |       parent_->Fire(); | 
 |     } | 
 |  | 
 |    private: | 
 |     Alarm* parent_; | 
 |   }; | 
 |   Adapter adapter_; | 
 | }; | 
 |  | 
 | AlarmFactory::AlarmFactory(Simulator* simulator, std::string name) | 
 |     : simulator_(simulator), name_(std::move(name)), counter_(0) {} | 
 |  | 
 | AlarmFactory::~AlarmFactory() {} | 
 |  | 
 | std::string AlarmFactory::GetNewAlarmName() { | 
 |   ++counter_; | 
 |   return QuicStringPrintf("%s (alarm %i)", name_.c_str(), counter_); | 
 | } | 
 |  | 
 | QuicAlarm* AlarmFactory::CreateAlarm(QuicAlarm::Delegate* delegate) { | 
 |   return new Alarm(simulator_, GetNewAlarmName(), | 
 |                    QuicArenaScopedPtr<QuicAlarm::Delegate>(delegate)); | 
 | } | 
 |  | 
 | QuicArenaScopedPtr<QuicAlarm> AlarmFactory::CreateAlarm( | 
 |     QuicArenaScopedPtr<QuicAlarm::Delegate> delegate, | 
 |     QuicConnectionArena* arena) { | 
 |   if (arena != nullptr) { | 
 |     return arena->New<Alarm>(simulator_, GetNewAlarmName(), | 
 |                              std::move(delegate)); | 
 |   } | 
 |   return QuicArenaScopedPtr<QuicAlarm>( | 
 |       new Alarm(simulator_, GetNewAlarmName(), std::move(delegate))); | 
 | } | 
 |  | 
 | }  // namespace simulator | 
 | }  // namespace quic |