Move alarm implementation to AlarmManager.
This commit is contained in:
parent
e6039ee308
commit
d8f2c204c7
@ -6,13 +6,51 @@
|
|||||||
//
|
//
|
||||||
#include "td/telegram/AlarmManager.h"
|
#include "td/telegram/AlarmManager.h"
|
||||||
|
|
||||||
|
#include "td/telegram/Global.h"
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
|
|
||||||
AlarmManager::AlarmManager(ActorShared<> parent) : parent_(std::move(parent)) {
|
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() {
|
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();
|
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(Status::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
|
} // namespace td
|
||||||
|
@ -7,8 +7,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "td/actor/actor.h"
|
#include "td/actor/actor.h"
|
||||||
|
#include "td/actor/MultiTimeout.h"
|
||||||
|
|
||||||
#include "td/utils/common.h"
|
#include "td/utils/common.h"
|
||||||
|
#include "td/utils/FlatHashMap.h"
|
||||||
|
#include "td/utils/Promise.h"
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
|
|
||||||
@ -18,10 +21,20 @@ class AlarmManager final : public Actor {
|
|||||||
public:
|
public:
|
||||||
explicit AlarmManager(ActorShared<> parent);
|
explicit AlarmManager(ActorShared<> parent);
|
||||||
|
|
||||||
|
void set_alarm(double seconds, Promise<Unit> &&promise);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void tear_down() final;
|
void tear_down() final;
|
||||||
|
|
||||||
|
static void on_alarm_timeout_callback(void *alarm_manager_ptr, int64 alarm_id);
|
||||||
|
|
||||||
|
void on_alarm_timeout(int64 alarm_id);
|
||||||
|
|
||||||
ActorShared<> parent_;
|
ActorShared<> parent_;
|
||||||
|
|
||||||
|
int64 alarm_id_ = 1;
|
||||||
|
FlatHashMap<int64, Promise<Unit>> pending_alarms_;
|
||||||
|
MultiTimeout alarm_timeout_{"AlarmTimeout"};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include "td/telegram/AccentColorId.h"
|
#include "td/telegram/AccentColorId.h"
|
||||||
#include "td/telegram/AccountManager.h"
|
#include "td/telegram/AccountManager.h"
|
||||||
|
#include "td/telegram/AlarmManager.h"
|
||||||
#include "td/telegram/AnimationsManager.h"
|
#include "td/telegram/AnimationsManager.h"
|
||||||
#include "td/telegram/Application.h"
|
#include "td/telegram/Application.h"
|
||||||
#include "td/telegram/AttachMenuManager.h"
|
#include "td/telegram/AttachMenuManager.h"
|
||||||
@ -7704,14 +7705,8 @@ void Requests::on_request(uint64 id, td_api::answerCustomQuery &request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Requests::on_request(uint64 id, const td_api::setAlarm &request) {
|
void Requests::on_request(uint64 id, const td_api::setAlarm &request) {
|
||||||
if (request.seconds_ < 0 || request.seconds_ > 3e9) {
|
CREATE_OK_REQUEST_PROMISE();
|
||||||
return send_error_raw(id, 400, "Wrong parameter seconds specified");
|
send_closure(td_->alarm_manager_, &AlarmManager::set_alarm, request.seconds_, std::move(promise));
|
||||||
}
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
int64 alarm_id = td_->alarm_id_++;
|
|
||||||
td_->pending_alarms_.emplace(alarm_id, id);
|
|
||||||
td_->alarm_timeout_.set_timeout_in(alarm_id, request.seconds_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Requests::on_request(uint64 id, td_api::searchHashtags &request) {
|
void Requests::on_request(uint64 id, td_api::searchHashtags &request) {
|
||||||
|
@ -135,25 +135,6 @@ Td::Td(unique_ptr<TdCallback> callback, Options options)
|
|||||||
|
|
||||||
Td::~Td() = default;
|
Td::~Td() = default;
|
||||||
|
|
||||||
void Td::on_alarm_timeout_callback(void *td_ptr, int64 alarm_id) {
|
|
||||||
auto td = static_cast<Td *>(td_ptr);
|
|
||||||
auto td_id = td->actor_id(td);
|
|
||||||
send_closure_later(td_id, &Td::on_alarm_timeout, alarm_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Td::on_alarm_timeout(int64 alarm_id) {
|
|
||||||
if (close_flag_ >= 2) {
|
|
||||||
// pending_alarms_ was already cleared
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto it = pending_alarms_.find(alarm_id);
|
|
||||||
CHECK(it != pending_alarms_.end());
|
|
||||||
uint64 request_id = it->second;
|
|
||||||
pending_alarms_.erase(alarm_id);
|
|
||||||
send_result(request_id, make_tl_object<td_api::ok>());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Td::ignore_background_updates() const {
|
bool Td::ignore_background_updates() const {
|
||||||
return can_ignore_background_updates_ && option_manager_->get_option_boolean("ignore_background_updates");
|
return can_ignore_background_updates_ && option_manager_->get_option_boolean("ignore_background_updates");
|
||||||
}
|
}
|
||||||
@ -456,9 +437,6 @@ void Td::start_up() {
|
|||||||
|
|
||||||
alarm_manager_ = create_actor<AlarmManager>("AlarmManager", create_reference());
|
alarm_manager_ = create_actor<AlarmManager>("AlarmManager", create_reference());
|
||||||
|
|
||||||
alarm_timeout_.set_callback(on_alarm_timeout_callback);
|
|
||||||
alarm_timeout_.set_callback_data(static_cast<void *>(this));
|
|
||||||
|
|
||||||
CHECK(state_ == State::WaitParameters);
|
CHECK(state_ == State::WaitParameters);
|
||||||
for (auto &update : get_fake_current_state()) {
|
for (auto &update : get_fake_current_state()) {
|
||||||
send_update(std::move(update));
|
send_update(std::move(update));
|
||||||
@ -624,12 +602,6 @@ void Td::dec_request_actor_refcnt() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Td::clear_requests() {
|
void Td::clear_requests() {
|
||||||
while (!pending_alarms_.empty()) {
|
|
||||||
auto it = pending_alarms_.begin();
|
|
||||||
auto alarm_id = it->first;
|
|
||||||
pending_alarms_.erase(it);
|
|
||||||
alarm_timeout_.cancel_timeout(alarm_id);
|
|
||||||
}
|
|
||||||
while (!request_set_.empty()) {
|
while (!request_set_.empty()) {
|
||||||
uint64 id = request_set_.begin()->first;
|
uint64 id = request_set_.begin()->first;
|
||||||
if (destroy_flag_) {
|
if (destroy_flag_) {
|
||||||
@ -774,6 +746,7 @@ void Td::close_impl(bool destroy_flag) {
|
|||||||
close_flag_ = 4;
|
close_flag_ = 4;
|
||||||
G()->set_close_flag();
|
G()->set_close_flag();
|
||||||
clear_requests();
|
clear_requests();
|
||||||
|
alarm_manager_.reset();
|
||||||
send_update(td_api::make_object<td_api::updateAuthorizationState>(
|
send_update(td_api::make_object<td_api::updateAuthorizationState>(
|
||||||
td_api::make_object<td_api::authorizationStateClosing>()));
|
td_api::make_object<td_api::authorizationStateClosing>()));
|
||||||
|
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
#include "td/telegram/telegram_api.h"
|
#include "td/telegram/telegram_api.h"
|
||||||
|
|
||||||
#include "td/actor/actor.h"
|
#include "td/actor/actor.h"
|
||||||
#include "td/actor/MultiTimeout.h"
|
|
||||||
|
|
||||||
#include "td/utils/buffer.h"
|
#include "td/utils/buffer.h"
|
||||||
#include "td/utils/common.h"
|
#include "td/utils/common.h"
|
||||||
@ -375,10 +374,6 @@ class Td final : public Actor {
|
|||||||
|
|
||||||
bool can_ignore_background_updates_ = false;
|
bool can_ignore_background_updates_ = false;
|
||||||
|
|
||||||
int64 alarm_id_ = 1;
|
|
||||||
FlatHashMap<int64, uint64> pending_alarms_;
|
|
||||||
MultiTimeout alarm_timeout_{"AlarmTimeout"};
|
|
||||||
|
|
||||||
vector<std::pair<uint64, td_api::object_ptr<td_api::Function>>> pending_preauthentication_requests_;
|
vector<std::pair<uint64, td_api::object_ptr<td_api::Function>>> pending_preauthentication_requests_;
|
||||||
|
|
||||||
vector<std::pair<uint64, td_api::object_ptr<td_api::Function>>> pending_set_parameters_requests_;
|
vector<std::pair<uint64, td_api::object_ptr<td_api::Function>>> pending_set_parameters_requests_;
|
||||||
@ -392,10 +387,6 @@ class Td final : public Actor {
|
|||||||
|
|
||||||
vector<td_api::object_ptr<td_api::Update>> get_fake_current_state() const;
|
vector<td_api::object_ptr<td_api::Update>> get_fake_current_state() const;
|
||||||
|
|
||||||
static void on_alarm_timeout_callback(void *td_ptr, int64 alarm_id);
|
|
||||||
|
|
||||||
void on_alarm_timeout(int64 alarm_id);
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
friend class RequestActor; // uses send_result/send_error
|
friend class RequestActor; // uses send_result/send_error
|
||||||
friend class AuthManager; // uses send_result/send_error, TODO pass Promise<>
|
friend class AuthManager; // uses send_result/send_error, TODO pass Promise<>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user