| Index: net/quic/core/congestion_control/simulation/alarm_factory.cc
|
| diff --git a/net/quic/core/congestion_control/simulation/alarm_factory.cc b/net/quic/core/congestion_control/simulation/alarm_factory.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..05864d52f3c29e57d4d43b8b224c2f1baed7052c
|
| --- /dev/null
|
| +++ b/net/quic/core/congestion_control/simulation/alarm_factory.cc
|
| @@ -0,0 +1,75 @@
|
| +#include "net/quic/core/congestion_control/simulation/alarm_factory.h"
|
| +#include "net/quic/core/quic_alarm.h"
|
| +
|
| +namespace net {
|
| +namespace simulation {
|
| +
|
| +// 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(time); }
|
| + 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 StringPrintf("%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 simulation
|
| +} // namespace net
|
|
|