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