X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d0d0465de5bc86ac7d36086a2f097788628a7c8d..db5adf7439201fb67d1d697b86806d58ace9fe85:/src/s4u/s4u_Actor.cpp?ds=sidebyside diff --git a/src/s4u/s4u_Actor.cpp b/src/s4u/s4u_Actor.cpp index b539dbd284..a6db8ffcc5 100644 --- a/src/s4u/s4u_Actor.cpp +++ b/src/s4u/s4u_Actor.cpp @@ -41,11 +41,11 @@ xbt::signal s4u::Actor::on_destruction; // ***** Actor creation ***** Actor* Actor::self() { - kernel::context::Context* self_context = kernel::context::Context::self(); + const kernel::context::Context* self_context = kernel::context::Context::self(); if (self_context == nullptr) return nullptr; - return self_context->get_actor()->ciface(); + return self_context->get_actor()->get_ciface(); } ActorPtr Actor::init(const std::string& name, s4u::Host* host) @@ -53,7 +53,16 @@ ActorPtr Actor::init(const std::string& name, s4u::Host* host) kernel::actor::ActorImpl* self = kernel::actor::ActorImpl::self(); kernel::actor::ActorImpl* actor = kernel::actor::simcall([self, &name, host] { return self->init(name, host).get(); }); - return actor->iface(); + return actor->get_iface(); +} + +/** Set a non-default stack size for this context (in Kb) + * + * This must be done before starting the actor, and it won't work with the thread factory. */ +ActorPtr Actor::set_stacksize(unsigned stacksize) +{ + pimpl_->set_stacksize(stacksize * 1024); + return this; } ActorPtr Actor::start(const std::function& code) @@ -68,7 +77,7 @@ ActorPtr Actor::create(const std::string& name, s4u::Host* host, const std::func kernel::actor::ActorImpl* actor = kernel::actor::simcall([self, &name, host, &code] { return self->init(name, host)->start(code); }); - return actor->iface(); + return actor->get_iface(); } ActorPtr Actor::create(const std::string& name, s4u::Host* host, const std::string& function, @@ -87,7 +96,7 @@ void intrusive_ptr_release(const Actor* actor) { intrusive_ptr_release(actor->pimpl_); } -int Actor::get_refcount() +int Actor::get_refcount() const { return pimpl_->get_refcount(); } @@ -109,7 +118,7 @@ void Actor::join(double timeout) issuer->simcall_answer(); } else { kernel::activity::ActivityImplPtr sync = issuer->join(target, timeout); - sync->register_simcall(&issuer->simcall); + sync->register_simcall(&issuer->simcall_); } }); } @@ -120,7 +129,7 @@ void Actor::set_auto_restart(bool autorestart) xbt_assert(autorestart && not pimpl_->has_to_auto_restart()); // FIXME: handle all cases pimpl_->set_auto_restart(autorestart); - kernel::actor::ProcessArg* arg = new kernel::actor::ProcessArg(pimpl_->get_host(), pimpl_); + auto* arg = new kernel::actor::ProcessArg(pimpl_->get_host(), pimpl_); XBT_DEBUG("Adding %s to the actors_at_boot_ list of Host %s", arg->name.c_str(), arg->host->get_cname()); pimpl_->get_host()->pimpl_->add_actor_at_boot(arg); }); @@ -146,11 +155,11 @@ void Actor::set_host(Host* new_host) const s4u::Host* previous_location = get_host(); kernel::actor::simcall([this, new_host]() { - if (pimpl_->waiting_synchro != nullptr) { + if (pimpl_->waiting_synchro_ != nullptr) { // The actor is blocked on an activity. If it's an exec, migrate it too. // FIXME: implement the migration of other kinds of activities kernel::activity::ExecImplPtr exec = - boost::dynamic_pointer_cast(pimpl_->waiting_synchro); + boost::dynamic_pointer_cast(pimpl_->waiting_synchro_); xbt_assert(exec.get() != nullptr, "We can only migrate blocked actors when they are blocked on executions."); exec->migrate(new_host); } @@ -225,7 +234,7 @@ void Actor::resume() s4u::Actor::on_resume(*this); } -bool Actor::is_suspended() +bool Actor::is_suspended() const { return pimpl_->is_suspended(); } @@ -236,7 +245,7 @@ void Actor::set_kill_time(double kill_time) } /** @brief Get the kill time of an actor(or 0 if unset). */ -double Actor::get_kill_time() +double Actor::get_kill_time() const { return pimpl_->get_kill_time(); } @@ -253,7 +262,7 @@ ActorPtr Actor::by_pid(aid_t pid) { kernel::actor::ActorImpl* actor = SIMIX_process_from_PID(pid); if (actor != nullptr) - return actor->iface(); + return actor->get_iface(); else return ActorPtr(); } @@ -309,7 +318,7 @@ void sleep_for(double duration) if (duration > 0) { kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self(); - Actor::on_sleep(*issuer->ciface()); + Actor::on_sleep(*issuer->get_ciface()); kernel::actor::simcall_blocking([issuer, duration]() { if (MC_is_active() || MC_record_replay_is_active()) { @@ -318,10 +327,10 @@ void sleep_for(double duration) return; } kernel::activity::ActivityImplPtr sync = issuer->sleep(duration); - sync->register_simcall(&issuer->simcall); + sync->register_simcall(&issuer->simcall_); }); - Actor::on_wake_up(*issuer->ciface()); + Actor::on_wake_up(*issuer->get_ciface()); } } @@ -361,7 +370,7 @@ void parallel_execute(const std::vector& hosts, const std::vectorset_flops_amount(flops_amount)->set_host(get_host()); return exec; } @@ -374,7 +383,7 @@ ExecPtr exec_init(const std::vector& hosts, const std::vector(hosts.front())); xbt_assert(std::all_of(hosts.begin(), hosts.end(), @@ -389,7 +398,7 @@ ExecPtr exec_init(const std::vector& hosts, const std::vectorset_flops_amounts(flops_amounts)->set_bytes_amounts(bytes_amounts)->set_hosts(hosts); return exec; } @@ -429,7 +438,7 @@ Host* get_host() void suspend() { kernel::actor::ActorImpl* self = simgrid::kernel::actor::ActorImpl::self(); - s4u::Actor::on_suspend(*self->ciface()); + s4u::Actor::on_suspend(*self->get_ciface()); kernel::actor::simcall_blocking([self] { self->suspend(); }); } @@ -441,7 +450,7 @@ void exit() void on_exit(const std::function& fun) { - simgrid::kernel::actor::ActorImpl::self()->iface()->on_exit(fun); + simgrid::kernel::actor::ActorImpl::self()->get_iface()->on_exit(fun); } /** @brief Moves the current actor to another host @@ -450,7 +459,7 @@ void on_exit(const std::function& fun) */ void set_host(Host* new_host) { - simgrid::kernel::actor::ActorImpl::self()->iface()->set_host(new_host); + simgrid::kernel::actor::ActorImpl::self()->get_iface()->set_host(new_host); } void migrate(Host* new_host) // deprecated { @@ -462,6 +471,23 @@ void migrate(Host* new_host) // deprecated } // namespace simgrid /* **************************** Public C interface *************************** */ +size_t sg_actor_count() +{ + return simgrid::s4u::Engine::get_instance()->get_actor_count(); +} + +sg_actor_t* sg_actor_list() +{ + const simgrid::s4u::Engine* e = simgrid::s4u::Engine::get_instance(); + size_t actor_count = e->get_actor_count(); + xbt_assert(actor_count > 0, "There is no actor!"); + std::vector actors = e->get_all_actors(); + + sg_actor_t* res = xbt_new(sg_actor_t, actors.size()); + for (size_t i = 0; i < actor_count; i++) + res[i] = actors[i].get(); + return res; +} sg_actor_t sg_actor_init(const char* name, sg_host_t host) { @@ -476,6 +502,17 @@ void sg_actor_start(sg_actor_t actor, xbt_main_func_t code, int argc, const char actor->start(std::move(function)); } +sg_actor_t sg_actor_create(const char* name, sg_host_t host, xbt_main_func_t code, int argc, const char* const* argv) +{ + simgrid::kernel::actor::ActorCode function = simgrid::xbt::wrap_main(code, argc, argv); + return simgrid::s4u::Actor::init(name, host)->start(std::move(function)).get(); +} + +void sg_actor_set_stacksize(sg_actor_t actor, unsigned size) +{ + actor->set_stacksize(size); +} + void sg_actor_exit() { simgrid::s4u::this_actor::exit(); @@ -587,7 +624,7 @@ void sg_actor_resume(sg_actor_t actor) * * This checks whether an actor is suspended or not by inspecting the task on which it was waiting for the completion. */ -int sg_actor_is_suspended(sg_actor_t actor) +int sg_actor_is_suspended(const_sg_actor_t actor) { return actor->is_suspended(); } @@ -701,7 +738,7 @@ sg_actor_t sg_actor_attach(const char* name, void* data, sg_host_t host, xbt_dic } simgrid::s4u::this_actor::yield(); - return actor->ciface(); + return actor->get_ciface(); } void sg_actor_detach() @@ -748,6 +785,10 @@ void sg_actor_execute(double flops) { simgrid::s4u::this_actor::execute(flops); } +void sg_actor_execute_with_priority(double flops, double priority) +{ + simgrid::s4u::this_actor::exec_init(flops)->set_priority(priority)->wait(); +} void sg_actor_parallel_execute(int host_nb, sg_host_t* host_list, double* flops_amount, double* bytes_amount) { @@ -787,7 +828,7 @@ void sg_actor_data_set(sg_actor_t actor, void* userdata) * The on_exit functions are the functions executed when your process is killed. * You should use them to free the data used by your process. */ -void sg_actor_on_exit(int_f_int_pvoid_t fun, void* data) +void sg_actor_on_exit(void_f_int_pvoid_t fun, void* data) { simgrid::s4u::this_actor::on_exit([fun, data](bool failed) { fun(failed ? 1 /*FAILURE*/ : 0 /*SUCCESS*/, data); }); } @@ -799,6 +840,23 @@ sg_exec_t sg_actor_exec_init(double computation_amount) return exec.get(); } +sg_exec_t sg_actor_parallel_exec_init(int host_nb, const sg_host_t* host_list, double* flops_amount, + double* bytes_amount) +{ + std::vector hosts(host_list, host_list + host_nb); + std::vector flops; + std::vector bytes; + if (flops_amount != nullptr) + flops = std::vector(flops_amount, flops_amount + host_nb); + if (bytes_amount != nullptr) + bytes = std::vector(bytes_amount, bytes_amount + host_nb * host_nb); + + simgrid::s4u::ExecPtr exec(new simgrid::s4u::Exec()); + exec->set_flops_amounts(flops)->set_bytes_amounts(bytes)->set_hosts(hosts); + exec->add_ref(); + return exec.get(); +} + sg_exec_t sg_actor_exec_async(double computation_amount) { simgrid::s4u::ExecPtr exec = simgrid::s4u::this_actor::exec_async(computation_amount);