Move connection state management to ConnectionStateManager.
This commit is contained in:
parent
7ce682984c
commit
86d6be1c59
@ -6,6 +6,12 @@
|
|||||||
//
|
//
|
||||||
#include "td/telegram/ConnectionStateManager.h"
|
#include "td/telegram/ConnectionStateManager.h"
|
||||||
|
|
||||||
|
#include "td/telegram/Global.h"
|
||||||
|
#include "td/telegram/StateManager.h"
|
||||||
|
#include "td/telegram/Td.h"
|
||||||
|
|
||||||
|
#include "td/utils/logging.h"
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
|
|
||||||
ConnectionStateManager::ConnectionStateManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) {
|
ConnectionStateManager::ConnectionStateManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) {
|
||||||
@ -15,4 +21,41 @@ void ConnectionStateManager::tear_down() {
|
|||||||
parent_.reset();
|
parent_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConnectionStateManager::start_up() {
|
||||||
|
class StateCallback final : public StateManager::Callback {
|
||||||
|
public:
|
||||||
|
explicit StateCallback(ActorId<ConnectionStateManager> parent) : parent_(std::move(parent)) {
|
||||||
|
}
|
||||||
|
bool on_state(ConnectionState state) final {
|
||||||
|
send_closure(parent_, &ConnectionStateManager::on_connection_state_changed, state);
|
||||||
|
return parent_.is_alive();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
ActorId<ConnectionStateManager> parent_;
|
||||||
|
};
|
||||||
|
send_closure(td_->state_manager_, &StateManager::add_callback, make_unique<StateCallback>(actor_id(this)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionStateManager::on_connection_state_changed(ConnectionState new_state) {
|
||||||
|
if (G()->close_flag()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (new_state == connection_state_) {
|
||||||
|
LOG(ERROR) << "State manager sent update about unchanged state " << static_cast<int32>(new_state);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
connection_state_ = new_state;
|
||||||
|
|
||||||
|
send_closure(G()->td(), &Td::send_update, get_update_connection_state_object(connection_state_));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionStateManager::get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const {
|
||||||
|
if (connection_state_ == ConnectionState::Empty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
updates.push_back(get_update_connection_state_object(connection_state_));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
//
|
//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "td/telegram/ConnectionState.h"
|
||||||
|
|
||||||
#include "td/actor/actor.h"
|
#include "td/actor/actor.h"
|
||||||
|
|
||||||
#include "td/utils/common.h"
|
#include "td/utils/common.h"
|
||||||
@ -18,9 +20,17 @@ class ConnectionStateManager final : public Actor {
|
|||||||
public:
|
public:
|
||||||
ConnectionStateManager(Td *td, ActorShared<> parent);
|
ConnectionStateManager(Td *td, ActorShared<> parent);
|
||||||
|
|
||||||
|
void get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void tear_down() final;
|
void tear_down() final;
|
||||||
|
|
||||||
|
void start_up() final;
|
||||||
|
|
||||||
|
void on_connection_state_changed(ConnectionState new_state);
|
||||||
|
|
||||||
|
ConnectionState connection_state_ = ConnectionState::Empty;
|
||||||
|
|
||||||
Td *td_;
|
Td *td_;
|
||||||
ActorShared<> parent_;
|
ActorShared<> parent_;
|
||||||
};
|
};
|
||||||
|
@ -2588,19 +2588,6 @@ void Td::on_result(NetQueryPtr query) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Td::on_connection_state_changed(ConnectionState new_state) {
|
|
||||||
if (G()->close_flag()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (new_state == connection_state_) {
|
|
||||||
LOG(ERROR) << "State manager sends update about unchanged state " << static_cast<int32>(new_state);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
connection_state_ = new_state;
|
|
||||||
|
|
||||||
send_closure(actor_id(this), &Td::send_update, get_update_connection_state_object(connection_state_));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Td::start_up() {
|
void Td::start_up() {
|
||||||
uint64 check_endianness = 0x0706050403020100;
|
uint64 check_endianness = 0x0706050403020100;
|
||||||
auto check_endianness_raw = reinterpret_cast<const unsigned char *>(&check_endianness);
|
auto check_endianness_raw = reinterpret_cast<const unsigned char *>(&check_endianness);
|
||||||
@ -3216,20 +3203,7 @@ void Td::process_binlog_events(TdDb::OpenedDatabase &&events) {
|
|||||||
|
|
||||||
void Td::init_options_and_network() {
|
void Td::init_options_and_network() {
|
||||||
VLOG(td_init) << "Create StateManager";
|
VLOG(td_init) << "Create StateManager";
|
||||||
class StateManagerCallback final : public StateManager::Callback {
|
|
||||||
public:
|
|
||||||
explicit StateManagerCallback(ActorShared<Td> td) : td_(std::move(td)) {
|
|
||||||
}
|
|
||||||
bool on_state(ConnectionState state) final {
|
|
||||||
send_closure(td_, &Td::on_connection_state_changed, state);
|
|
||||||
return td_.is_alive();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
ActorShared<Td> td_;
|
|
||||||
};
|
|
||||||
state_manager_ = create_actor<StateManager>("State manager", create_reference());
|
state_manager_ = create_actor<StateManager>("State manager", create_reference());
|
||||||
send_closure(state_manager_, &StateManager::add_callback, make_unique<StateManagerCallback>(create_reference()));
|
|
||||||
G()->set_state_manager(state_manager_.get());
|
G()->set_state_manager(state_manager_.get());
|
||||||
|
|
||||||
VLOG(td_init) << "Create OptionManager";
|
VLOG(td_init) << "Create OptionManager";
|
||||||
@ -3823,7 +3797,7 @@ void Td::on_request(uint64 id, const td_api::getCurrentState &request) {
|
|||||||
updates.push_back(td_api::make_object<td_api::updateAuthorizationState>(std::move(state)));
|
updates.push_back(td_api::make_object<td_api::updateAuthorizationState>(std::move(state)));
|
||||||
}
|
}
|
||||||
|
|
||||||
updates.push_back(get_update_connection_state_object(connection_state_));
|
connection_state_manager_->get_current_state(updates);
|
||||||
|
|
||||||
if (auth_manager_->is_authorized()) {
|
if (auth_manager_->is_authorized()) {
|
||||||
user_manager_->get_current_state(updates);
|
user_manager_->get_current_state(updates);
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
//
|
//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "td/telegram/ConnectionState.h"
|
|
||||||
#include "td/telegram/files/FileId.h"
|
#include "td/telegram/files/FileId.h"
|
||||||
#include "td/telegram/net/MtprotoHeader.h"
|
#include "td/telegram/net/MtprotoHeader.h"
|
||||||
#include "td/telegram/net/NetQuery.h"
|
#include "td/telegram/net/NetQuery.h"
|
||||||
@ -341,8 +340,6 @@ class Td final : public Actor {
|
|||||||
static constexpr int64 PING_SERVER_ALARM_ID = -1;
|
static constexpr int64 PING_SERVER_ALARM_ID = -1;
|
||||||
static constexpr int32 PING_SERVER_TIMEOUT = 300;
|
static constexpr int32 PING_SERVER_TIMEOUT = 300;
|
||||||
|
|
||||||
void on_connection_state_changed(ConnectionState new_state);
|
|
||||||
|
|
||||||
void run_request(uint64 id, td_api::object_ptr<td_api::Function> function);
|
void run_request(uint64 id, td_api::object_ptr<td_api::Function> function);
|
||||||
|
|
||||||
void do_run_request(uint64 id, td_api::object_ptr<td_api::Function> &&function);
|
void do_run_request(uint64 id, td_api::object_ptr<td_api::Function> &&function);
|
||||||
@ -371,8 +368,6 @@ class Td final : public Actor {
|
|||||||
|
|
||||||
MtprotoHeader::Options options_;
|
MtprotoHeader::Options options_;
|
||||||
|
|
||||||
ConnectionState connection_state_ = ConnectionState::Empty;
|
|
||||||
|
|
||||||
std::unordered_multimap<uint64, int32> request_set_;
|
std::unordered_multimap<uint64, int32> request_set_;
|
||||||
int actor_refcnt_ = 0;
|
int actor_refcnt_ = 0;
|
||||||
int request_actor_refcnt_ = 0;
|
int request_actor_refcnt_ = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user