blob: 024874a31195f65c8956da2a0cbf4b2094ff57d2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2026
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#include "td/telegram/AlarmManager.h"
#include "td/telegram/Global.h"
namespace td {
AlarmManager::AlarmManager(ActorShared<> parent) : parent_(std::move(parent)) {
alarm_timeout_.set_callback(on_alarm_timeout_callback);
alarm_timeout_.set_callback_data(static_cast<void *>(this));
}
void AlarmManager::tear_down() {
while (!pending_alarms_.empty()) {
auto it = pending_alarms_.begin();
auto alarm_id = it->first;
auto promise = std::move(it->second);
pending_alarms_.erase(it);
promise.set_error(G()->request_aborted_error());
alarm_timeout_.cancel_timeout(alarm_id);
}
parent_.reset();
}
void AlarmManager::on_alarm_timeout_callback(void *alarm_manager_ptr, int64 alarm_id) {
auto alarm_manager = static_cast<AlarmManager *>(alarm_manager_ptr);
auto alarm_manager_id = alarm_manager->actor_id(alarm_manager);
send_closure_later(alarm_manager_id, &AlarmManager::on_alarm_timeout, alarm_id);
}
void AlarmManager::on_alarm_timeout(int64 alarm_id) {
auto it = pending_alarms_.find(alarm_id);
if (it == pending_alarms_.end()) {
return;
}
auto promise = std::move(it->second);
pending_alarms_.erase(alarm_id);
promise.set_value(Unit());
}
void AlarmManager::set_alarm(double seconds, Promise<Unit> &&promise) {
if (seconds < 0 || seconds > 3e9) {
return promise.set_error(400, "Wrong parameter seconds specified");
}
auto alarm_id = alarm_id_++;
pending_alarms_.emplace(alarm_id, std::move(promise));
alarm_timeout_.set_timeout_in(alarm_id, seconds);
}
} // namespace td
|