Make MtprotoHeader thread-safe.

This commit is contained in:
levlam 2023-07-26 12:48:59 +03:00
parent 1ab81f426c
commit e8d92b0dcb
2 changed files with 18 additions and 10 deletions

View File

@ -9,6 +9,7 @@
#include "td/telegram/net/Proxy.h" #include "td/telegram/net/Proxy.h"
#include "td/utils/common.h" #include "td/utils/common.h"
#include "td/utils/port/RwMutex.h"
#include "td/utils/Slice.h" #include "td/utils/Slice.h"
namespace td { namespace td {
@ -30,15 +31,18 @@ class MtprotoHeader {
}; };
explicit MtprotoHeader(const Options &options) : options_(options) { explicit MtprotoHeader(const Options &options) : options_(options) {
gen_headers(); default_header_ = gen_header(options_, false);
anonymous_header_ = gen_header(options_, true);
} }
void set_proxy(Proxy proxy) { void set_proxy(Proxy proxy) {
auto lock = rw_mutex_.lock_write();
options_.proxy = std::move(proxy); options_.proxy = std::move(proxy);
default_header_ = gen_header(options_, false); default_header_ = gen_header(options_, false);
} }
bool set_parameters(string parameters) { bool set_parameters(string parameters) {
auto lock = rw_mutex_.lock_write();
if (options_.parameters == parameters) { if (options_.parameters == parameters) {
return false; return false;
} }
@ -49,6 +53,7 @@ class MtprotoHeader {
} }
bool set_is_emulator(bool is_emulator) { bool set_is_emulator(bool is_emulator) {
auto lock = rw_mutex_.lock_write();
if (options_.is_emulator == is_emulator) { if (options_.is_emulator == is_emulator) {
return false; return false;
} }
@ -59,6 +64,7 @@ class MtprotoHeader {
} }
bool set_language_pack(string language_pack) { bool set_language_pack(string language_pack) {
auto lock = rw_mutex_.lock_write();
if (options_.language_pack == language_pack) { if (options_.language_pack == language_pack) {
return false; return false;
} }
@ -69,6 +75,7 @@ class MtprotoHeader {
} }
bool set_language_code(string language_code) { bool set_language_code(string language_code) {
auto lock = rw_mutex_.lock_write();
if (options_.language_code == language_code) { if (options_.language_code == language_code) {
return false; return false;
} }
@ -79,6 +86,7 @@ class MtprotoHeader {
} }
bool set_tz_offset(int32 tz_offset) { bool set_tz_offset(int32 tz_offset) {
auto lock = rw_mutex_.lock_write();
if (options_.tz_offset == tz_offset) { if (options_.tz_offset == tz_offset) {
return false; return false;
} }
@ -88,14 +96,18 @@ class MtprotoHeader {
return true; return true;
} }
Slice get_default_header() const { string get_default_header() const {
auto lock = rw_mutex_.lock_read();
return default_header_; return default_header_;
} }
Slice get_anonymous_header() const {
string get_anonymous_header() const {
auto lock = rw_mutex_.lock_read();
return anonymous_header_; return anonymous_header_;
} }
string get_system_language_code() const { string get_system_language_code() const {
auto lock = rw_mutex_.lock_read();
return options_.system_language_code; return options_.system_language_code;
} }
@ -103,11 +115,7 @@ class MtprotoHeader {
Options options_; Options options_;
string default_header_; string default_header_;
string anonymous_header_; string anonymous_header_;
mutable RwMutex rw_mutex_;
void gen_headers() {
default_header_ = gen_header(options_, false);
anonymous_header_ = gen_header(options_, true);
}
static string gen_header(const Options &options, bool is_anonymous); static string gen_header(const Options &options, bool is_anonymous);
}; };

View File

@ -278,9 +278,9 @@ Session::Session(unique_ptr<Callback> callback, std::shared_ptr<AuthDataShared>
long_poll_connection_.connection_id_ = 1; long_poll_connection_.connection_id_ = 1;
if (is_cdn) { if (is_cdn) {
auth_data_.set_header(G()->mtproto_header().get_anonymous_header().str()); auth_data_.set_header(G()->mtproto_header().get_anonymous_header());
} else { } else {
auth_data_.set_header(G()->mtproto_header().get_default_header().str()); auth_data_.set_header(G()->mtproto_header().get_default_header());
} }
last_activity_timestamp_ = now; last_activity_timestamp_ = now;
last_success_timestamp_ = now - 366 * 86400; last_success_timestamp_ = now - 366 * 86400;