blob: 2a088687ef1a5644b1e55dd46a43078726151395 [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
QUICHE team5be974e2020-12-29 18:35:24 -05005#include "quic/core/quic_epoll_alarm_factory.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -05006
7#include <type_traits>
8
QUICHE team5be974e2020-12-29 18:35:24 -05009#include "quic/core/quic_arena_scoped_ptr.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050010
11namespace quic {
12namespace {
13
14class QuicEpollAlarm : public QuicAlarm {
15 public:
16 QuicEpollAlarm(QuicEpollServer* epoll_server,
17 QuicArenaScopedPtr<QuicAlarm::Delegate> delegate)
18 : QuicAlarm(std::move(delegate)),
19 epoll_server_(epoll_server),
20 epoll_alarm_impl_(this) {}
21
22 protected:
23 void SetImpl() override {
vasilvvf8035162021-02-01 14:49:14 -080024 QUICHE_DCHECK(deadline().IsInitialized());
QUICHE teama6ef0a62019-03-07 20:34:33 -050025 epoll_server_->RegisterAlarm(
26 (deadline() - QuicTime::Zero()).ToMicroseconds(), &epoll_alarm_impl_);
27 }
28
29 void CancelImpl() override {
vasilvvf8035162021-02-01 14:49:14 -080030 QUICHE_DCHECK(!deadline().IsInitialized());
QUICHE teama6ef0a62019-03-07 20:34:33 -050031 epoll_alarm_impl_.UnregisterIfRegistered();
32 }
33
34 void UpdateImpl() override {
vasilvvf8035162021-02-01 14:49:14 -080035 QUICHE_DCHECK(deadline().IsInitialized());
QUICHE teama6ef0a62019-03-07 20:34:33 -050036 int64_t epoll_deadline = (deadline() - QuicTime::Zero()).ToMicroseconds();
37 if (epoll_alarm_impl_.registered()) {
38 epoll_alarm_impl_.ReregisterAlarm(epoll_deadline);
39 } else {
40 epoll_server_->RegisterAlarm(epoll_deadline, &epoll_alarm_impl_);
41 }
42 }
43
44 private:
45 class EpollAlarmImpl : public QuicEpollAlarmBase {
46 public:
47 using int64_epoll = decltype(QuicEpollAlarmBase().OnAlarm());
48
49 explicit EpollAlarmImpl(QuicEpollAlarm* alarm) : alarm_(alarm) {}
50
51 // Use the same integer type as the base class.
52 int64_epoll OnAlarm() override {
53 QuicEpollAlarmBase::OnAlarm();
54 alarm_->Fire();
55 // Fire will take care of registering the alarm, if needed.
56 return 0;
57 }
58
59 private:
60 QuicEpollAlarm* alarm_;
61 };
62
63 QuicEpollServer* epoll_server_;
64 EpollAlarmImpl epoll_alarm_impl_;
65};
66
67} // namespace
68
69QuicEpollAlarmFactory::QuicEpollAlarmFactory(QuicEpollServer* epoll_server)
70 : epoll_server_(epoll_server) {}
71
72QuicEpollAlarmFactory::~QuicEpollAlarmFactory() = default;
73
74QuicAlarm* QuicEpollAlarmFactory::CreateAlarm(QuicAlarm::Delegate* delegate) {
75 return new QuicEpollAlarm(epoll_server_,
76 QuicArenaScopedPtr<QuicAlarm::Delegate>(delegate));
77}
78
79QuicArenaScopedPtr<QuicAlarm> QuicEpollAlarmFactory::CreateAlarm(
80 QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
81 QuicConnectionArena* arena) {
82 if (arena != nullptr) {
83 return arena->New<QuicEpollAlarm>(epoll_server_, std::move(delegate));
84 }
85 return QuicArenaScopedPtr<QuicAlarm>(
86 new QuicEpollAlarm(epoll_server_, std::move(delegate)));
87}
88
89} // namespace quic