diff --git a/td/telegram/Client.cpp b/td/telegram/Client.cpp
index b9e7d6d4..d60e618c 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 2729167c..a46cd6e8 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 c82a85db..3c135ff4 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 959fc8db..1bfd7a29 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 d8915dd9..5a4cc1e3 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();
| |