return this->new_context<JavaContext>(std::move(code), actor);
}
-void JavaContextFactory::run_all()
+void JavaContextFactory::run_all(std::vector<actor::ActorImpl*> const& actors)
{
- SerialThreadContext::run_all();
+ SerialThreadContext::run_all(actors);
}
JavaContext::JavaContext(std::function<void()>&& code, smx_actor_t actor)
JavaContextFactory();
~JavaContextFactory() override;
Context* create_context(std::function<void()>&& code, actor::ActorImpl* actor) override;
- void run_all() override;
+ void run_all(std::vector<actor::ActorImpl*> const& actors) override;
};
XBT_PRIVATE ContextFactory* java_factory();
*/
void EngineImpl::run_all_actors()
{
- instance_->get_context_factory()->run_all();
+ instance_->get_context_factory()->run_all(actors_to_run_);
for (auto const& actor : actors_to_run_)
if (actor->to_be_freed())
/** Turn the current thread into maestro (the old maestro becomes a regular actor) */
virtual Context* create_maestro(std::function<void()>&& code, actor::ActorImpl* actor);
- virtual void run_all() = 0;
+ virtual void run_all(std::vector<actor::ActorImpl*> const& actors_list) = 0;
protected:
template <class T, class... Args> T* new_context(Args&&... args)
}
/** Maestro wants to run all ready actors */
-void SwappedContextFactory::run_all()
+void SwappedContextFactory::run_all(std::vector<actor::ActorImpl*> const& actors_list)
{
const auto* engine = EngineImpl::get_instance();
/* This function is called by maestro at the beginning of a scheduling round to get all working threads executing some
auto* context = static_cast<SwappedContext*>(actor->context_.get());
context->resume();
},
- engine->get_actors_to_run());
+ actors_list);
} else { // sequential execution
- if (not engine->has_actors_to_run())
+ if (actors_list.empty())
return;
/* maestro is already saved in the first slot of workers_context_ */
SwappedContextFactory() = default;
SwappedContextFactory(const SwappedContextFactory&) = delete;
SwappedContextFactory& operator=(const SwappedContextFactory&) = delete;
- void run_all() override;
+ void run_all(std::vector<actor::ActorImpl*> const& actors) override;
private:
/* For the sequential execution */
return this->new_context<SerialThreadContext>(std::move(code), actor, maestro);
}
-void ThreadContextFactory::run_all()
-{
- if (is_parallel()) {
- // Parallel execution
- ParallelThreadContext::run_all();
- } else {
- // Serial execution
- SerialThreadContext::run_all();
- }
+void ThreadContextFactory::run_all(std::vector<actor::ActorImpl*> const& actors_list)
+{
+ if (is_parallel())
+ ParallelThreadContext::run_all(actors_list);
+
+ else
+ SerialThreadContext::run_all(actors_list);
}
// ThreadContext
// SerialThreadContext
-void SerialThreadContext::run_all()
+void SerialThreadContext::run_all(std::vector<actor::ActorImpl*> const& actors_list)
{
- const auto& to_run = EngineImpl::get_instance()->get_actors_to_run();
- for (smx_actor_t const& actor : to_run) {
+ for (smx_actor_t const& actor : actors_list) {
XBT_DEBUG("Handling %p", actor);
auto* context = static_cast<ThreadContext*>(actor->context_.get());
context->release();
thread_sem_ = nullptr;
}
-void ParallelThreadContext::run_all()
+void ParallelThreadContext::run_all(std::vector<actor::ActorImpl*> const& actors_list)
{
- const auto& to_release = EngineImpl::get_instance()->get_actors_to_run();
- for (smx_actor_t const& actor : to_release)
+ for (smx_actor_t const& actor : actors_list)
static_cast<ThreadContext*>(actor->context_.get())->release();
- const auto& to_wait = EngineImpl::get_instance()->get_actors_to_run();
- for (smx_actor_t const& actor : to_wait)
+
+ for (smx_actor_t const& actor : actors_list)
static_cast<ThreadContext*>(actor->context_.get())->wait();
}
{
}
- static void run_all();
+ static void run_all(std::vector<actor::ActorImpl*> const& actors_list);
};
class ParallelThreadContext : public ThreadContext {
static void initialize();
static void finalize();
- static void run_all();
+ static void run_all(std::vector<actor::ActorImpl*> const& actors_list);
private:
static xbt::OsSemaphore* thread_sem_;
bool maestro = not code;
return create_context(std::move(code), actor, maestro);
}
- void run_all() override;
+ void run_all(std::vector<actor::ActorImpl*> const& actors) override;
// Optional methods:
ThreadContext* attach(actor::ActorImpl* actor) override