aboutsummaryrefslogtreecommitdiffhomepage
path: root/tdactor
diff options
context:
space:
mode:
authorlevlam <levlam@telegram.org>2022-06-30 00:28:25 +0300
committerlevlam <levlam@telegram.org>2022-06-30 00:28:25 +0300
commit32724a5a6c6d2af74a018834b79474e48a888ef5 (patch)
tree3c2f8106b392034edcb9ba82972e4e0fb324d3fd /tdactor
parentaa635a89c2955dc04a7e20704bdcf5ac33725a4e (diff)
Add and use Scheduler::run_on_scheduler.
Diffstat (limited to 'tdactor')
-rw-r--r--tdactor/td/actor/impl/Scheduler-decl.h3
-rw-r--r--tdactor/td/actor/impl/Scheduler.cpp22
2 files changed, 25 insertions, 0 deletions
diff --git a/tdactor/td/actor/impl/Scheduler-decl.h b/tdactor/td/actor/impl/Scheduler-decl.h
index 8fb9292fc..396995e6c 100644
--- a/tdactor/td/actor/impl/Scheduler-decl.h
+++ b/tdactor/td/actor/impl/Scheduler-decl.h
@@ -22,6 +22,7 @@
#include "td/utils/port/Poll.h"
#include "td/utils/port/PollFlags.h"
#include "td/utils/port/thread_local.h"
+#include "td/utils/Promise.h"
#include "td/utils/Slice.h"
#include "td/utils/Time.h"
#include "td/utils/type_traits.h"
@@ -98,6 +99,8 @@ class Scheduler {
void send_to_scheduler(int32 sched_id, const ActorId<> &actor_id, Event &&event);
void send_to_other_scheduler(int32 sched_id, const ActorId<> &actor_id, Event &&event);
+ void run_on_scheduler(int32 sched_id, Promise<Unit> action); // TODO Action
+
template <ActorSendType send_type, class EventT>
void send_lambda(ActorRef actor_ref, EventT &&lambda);
diff --git a/tdactor/td/actor/impl/Scheduler.cpp b/tdactor/td/actor/impl/Scheduler.cpp
index 11ddfbf6e..9ad7cb72c 100644
--- a/tdactor/td/actor/impl/Scheduler.cpp
+++ b/tdactor/td/actor/impl/Scheduler.cpp
@@ -339,6 +339,28 @@ void Scheduler::send_to_other_scheduler(int32 sched_id, const ActorId<> &actor_i
}
}
+void Scheduler::run_on_scheduler(int32 sched_id, Promise<Unit> action) {
+ if (sched_id >= 0 && sched_id_ != sched_id) {
+ class Worker final : public Actor {
+ public:
+ explicit Worker(Promise<Unit> action) : action_(std::move(action)) {
+ }
+
+ private:
+ Promise<Unit> action_;
+
+ void start_up() final {
+ action_.set_value(Unit());
+ stop();
+ }
+ };
+ create_actor_on_scheduler<Worker>("RunOnSchedulerWorker", sched_id, std::move(action)).release();
+ return;
+ }
+
+ action.set_value(Unit());
+}
+
void Scheduler::add_to_mailbox(ActorInfo *actor_info, Event &&event) {
if (!actor_info->is_running()) {
auto node = actor_info->get_list_node();