diff options
| author | levlam <levlam@telegram.org> | 2022-06-30 00:28:25 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2022-06-30 00:28:25 +0300 |
| commit | 32724a5a6c6d2af74a018834b79474e48a888ef5 (patch) | |
| tree | 3c2f8106b392034edcb9ba82972e4e0fb324d3fd /tdactor | |
| parent | aa635a89c2955dc04a7e20704bdcf5ac33725a4e (diff) | |
Add and use Scheduler::run_on_scheduler.
Diffstat (limited to 'tdactor')
| -rw-r--r-- | tdactor/td/actor/impl/Scheduler-decl.h | 3 | ||||
| -rw-r--r-- | tdactor/td/actor/impl/Scheduler.cpp | 22 |
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(); |
