blob: e79607efe87af122ad84a1138efacc2d55b51a90 [file] [log] [blame]
// Copyright 2022 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.
#ifndef QUICHE_QUIC_CORE_QUIC_QUEUE_ALARM_FACTORY_H_
#define QUICHE_QUIC_CORE_QUIC_QUEUE_ALARM_FACTORY_H_
#include <memory>
#include <optional>
#include "absl/container/btree_map.h"
#include "quiche/quic/core/quic_alarm.h"
#include "quiche/quic/core/quic_alarm_factory.h"
#include "quiche/quic/core/quic_arena_scoped_ptr.h"
#include "quiche/quic/core/quic_one_block_arena.h"
#include "quiche/quic/core/quic_time.h"
#include "quiche/common/platform/api/quiche_export.h"
namespace quic {
// QuicQueueAlarmFactory maintains a queue of scheduled alarms internally, and
// provides methods to query the time of the next alarm and to execute all of
// the ones that are past the deadline.
class QUICHE_EXPORT QuicQueueAlarmFactory : public QuicAlarmFactory {
public:
// Calls all of the alarm callbacks that are scheduled before or at |time|.
void ProcessAlarmsUpTo(QuicTime time);
// Returns the deadline of the next upcoming alarm, if any are scheduled.
std::optional<QuicTime> GetNextUpcomingAlarm() const;
// QuicAlarmFactory implementation.
QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate) override;
QuicArenaScopedPtr<QuicAlarm> CreateAlarm(
QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
QuicConnectionArena* arena) override;
private:
class Alarm : public QuicAlarm {
public:
Alarm(QuicQueueAlarmFactory* factory,
QuicArenaScopedPtr<QuicAlarm::Delegate> delegate);
void SetImpl() override;
void CancelImpl() override;
void DoFire() {
current_schedule_handle_.reset();
Fire();
}
private:
QuicQueueAlarmFactory* factory_;
// Deleted when the alarm is cancelled, causing the corresponding weak_ptr
// in the alarm list to not be executed.
std::shared_ptr<Alarm*> current_schedule_handle_;
};
// Alarms are stored as weak pointers, since the alarm can be cancelled and
// disappear while in the queue.
using AlarmList = absl::btree_multimap<QuicTime, std::weak_ptr<Alarm*>>;
AlarmList alarms_;
};
} // namespace quic
#endif // QUICHE_QUIC_CORE_QUIC_QUEUE_ALARM_FACTORY_H_