blob: e748da5b0f46a14ccf638f2cc36fa32ffbb6a079 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2012 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/third_party/quiche/src/quic/test_tools/simulator/alarm_factory.h"
6
7#include "net/third_party/quiche/src/quic/core/quic_alarm.h"
8#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h"
9
10namespace quic {
11namespace simulator {
12
13// Alarm is an implementation of QuicAlarm which can schedule alarms in the
14// simulation timeline.
15class Alarm : public QuicAlarm {
16 public:
17 Alarm(Simulator* simulator,
vasilvvc48c8712019-03-11 13:38:16 -070018 std::string name,
QUICHE teama6ef0a62019-03-07 20:34:33 -050019 QuicArenaScopedPtr<QuicAlarm::Delegate> delegate)
20 : QuicAlarm(std::move(delegate)), adapter_(simulator, name, this) {}
21 ~Alarm() override {}
22
23 void SetImpl() override {
24 DCHECK(deadline().IsInitialized());
25 adapter_.Set(deadline());
26 }
27
28 void CancelImpl() override { adapter_.Cancel(); }
29
30 private:
31 // An adapter class triggering a QuicAlarm using a simulation time system.
32 // An adapter is required here because neither Actor nor QuicAlarm are pure
33 // interfaces.
34 class Adapter : public Actor {
35 public:
vasilvvc48c8712019-03-11 13:38:16 -070036 Adapter(Simulator* simulator, std::string name, Alarm* parent)
QUICHE teama6ef0a62019-03-07 20:34:33 -050037 : Actor(simulator, name), parent_(parent) {}
38 ~Adapter() override {}
39
40 void Set(QuicTime time) { Schedule(std::max(time, clock_->Now())); }
41 void Cancel() { Unschedule(); }
42
43 void Act() override {
44 DCHECK(clock_->Now() >= parent_->deadline());
45 parent_->Fire();
46 }
47
48 private:
49 Alarm* parent_;
50 };
51 Adapter adapter_;
52};
53
vasilvvc48c8712019-03-11 13:38:16 -070054AlarmFactory::AlarmFactory(Simulator* simulator, std::string name)
QUICHE teama6ef0a62019-03-07 20:34:33 -050055 : simulator_(simulator), name_(std::move(name)), counter_(0) {}
56
57AlarmFactory::~AlarmFactory() {}
58
vasilvvc48c8712019-03-11 13:38:16 -070059std::string AlarmFactory::GetNewAlarmName() {
QUICHE teama6ef0a62019-03-07 20:34:33 -050060 ++counter_;
61 return QuicStringPrintf("%s (alarm %i)", name_.c_str(), counter_);
62}
63
64QuicAlarm* AlarmFactory::CreateAlarm(QuicAlarm::Delegate* delegate) {
65 return new Alarm(simulator_, GetNewAlarmName(),
66 QuicArenaScopedPtr<QuicAlarm::Delegate>(delegate));
67}
68
69QuicArenaScopedPtr<QuicAlarm> AlarmFactory::CreateAlarm(
70 QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
71 QuicConnectionArena* arena) {
72 if (arena != nullptr) {
73 return arena->New<Alarm>(simulator_, GetNewAlarmName(),
74 std::move(delegate));
75 }
76 return QuicArenaScopedPtr<QuicAlarm>(
77 new Alarm(simulator_, GetNewAlarmName(), std::move(delegate)));
78}
79
80} // namespace simulator
81} // namespace quic