From eaf48c36a11d0eb601ba817d245c6f0b0df29b96 Mon Sep 17 00:00:00 2001 From: Arseny Smirnov Date: Tue, 23 Apr 2019 11:56:32 +0300 Subject: [PATCH] Client: set unique tag for each Td actor GitOrigin-RevId: 7ee500c44703a395aae9151969b6bb8e3aee5ebd --- td/telegram/Client.cpp | 18 +++++++++++++----- tdactor/td/actor/impl/Actor-decl.h | 4 ++-- tdactor/td/actor/impl/Actor.h | 14 ++++++++++---- tdactor/td/actor/impl/ActorInfo-decl.h | 2 +- tdactor/td/actor/impl/ActorInfo.h | 5 +++-- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/td/telegram/Client.cpp b/td/telegram/Client.cpp index b9e7d6d47..d60e618c7 100644 --- a/td/telegram/Client.cpp +++ b/td/telegram/Client.cpp @@ -116,10 +116,18 @@ class MultiTd : public Actor { CHECK(td.empty()); string name = "Td"; - if (td_id != 0) { - name += PSTRING() << '#' << td_id; - } - td = create_actor(name, std::move(callback)); + class TdActorContext : public ActorContext { + public: + TdActorContext(std::string tag) : tag_(std::move(tag)) { + } + std::string tag_; + }; + auto context = std::make_shared(to_string(td_id)); + auto old_context = set_context(context); + auto old_tag = set_tag(context->tag_); + td = create_actor("Td", std::move(callback)); + set_context(old_context); + set_tag(old_tag); } void send(int32 td_id, Client::Request request) { auto &td = tds_[td_id]; @@ -176,6 +184,7 @@ class MultiImpl { MultiImpl &operator=(MultiImpl &&) = delete; int32 create_id() { + static std::atomic id_{0}; return id_.fetch_add(1) + 1; } @@ -207,7 +216,6 @@ class MultiImpl { std::shared_ptr concurrent_scheduler_; thread scheduler_thread_; ActorOwn multi_td_; - std::atomic id_{0}; }; class Client::Impl final { diff --git a/tdactor/td/actor/impl/Actor-decl.h b/tdactor/td/actor/impl/Actor-decl.h index 2729167cf..a46cd6e85 100644 --- a/tdactor/td/actor/impl/Actor-decl.h +++ b/tdactor/td/actor/impl/Actor-decl.h @@ -74,8 +74,8 @@ class Actor : public ObserverBase { void do_migrate(int32 sched_id); uint64 get_link_token(); - void set_context(std::shared_ptr context); - void set_tag(CSlice tag); + std::shared_ptr set_context(std::shared_ptr context); + CSlice set_tag(CSlice tag); void always_wait_for_mailbox(); diff --git a/tdactor/td/actor/impl/Actor.h b/tdactor/td/actor/impl/Actor.h index c82a85db3..3c135ff43 100644 --- a/tdactor/td/actor/impl/Actor.h +++ b/tdactor/td/actor/impl/Actor.h @@ -85,12 +85,18 @@ std::enable_if_t::value> finish_migrate(ActorT inline uint64 Actor::get_link_token() { return Scheduler::instance()->get_link_token(this); } -inline void Actor::set_context(std::shared_ptr context) { - info_->set_context(std::move(context)); +inline std::shared_ptr Actor::set_context(std::shared_ptr context) { + return info_->set_context(std::move(context)); } -inline void Actor::set_tag(CSlice tag) { - info_->get_context()->tag_ = tag.c_str(); +inline CSlice Actor::set_tag(CSlice tag) { + auto &tag_ref = info_->get_context()->tag_; + CSlice old_tag; + if (tag_ref) { + old_tag = CSlice(tag_ref); + } + tag_ref = tag.c_str(); Scheduler::on_context_updated(); + return old_tag; } inline void Actor::init(ObjectPool::OwnerPtr &&info) { diff --git a/tdactor/td/actor/impl/ActorInfo-decl.h b/tdactor/td/actor/impl/ActorInfo-decl.h index 959fc8db1..1bfd7a295 100644 --- a/tdactor/td/actor/impl/ActorInfo-decl.h +++ b/tdactor/td/actor/impl/ActorInfo-decl.h @@ -74,7 +74,7 @@ class ActorInfo Actor *get_actor_unsafe(); const Actor *get_actor_unsafe() const; - void set_context(std::shared_ptr context); + std::shared_ptr set_context(std::shared_ptr context); ActorContext *get_context(); const ActorContext *get_context() const; CSlice get_name() const; diff --git a/tdactor/td/actor/impl/ActorInfo.h b/tdactor/td/actor/impl/ActorInfo.h index d8915dd93..5a4cc1e31 100644 --- a/tdactor/td/actor/impl/ActorInfo.h +++ b/tdactor/td/actor/impl/ActorInfo.h @@ -143,13 +143,14 @@ inline const Actor *ActorInfo::get_actor_unsafe() const { return actor_; } -inline void ActorInfo::set_context(std::shared_ptr context) { +inline std::shared_ptr ActorInfo::set_context(std::shared_ptr context) { CHECK(is_running()); context->this_ptr_ = context; context->tag_ = Scheduler::context()->tag_; - context_ = std::move(context); + std::swap(context_, context); Scheduler::context() = context_.get(); Scheduler::on_context_updated(); + return context; } inline const ActorContext *ActorInfo::get_context() const { return context_.get();