X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c97656604936a7d3000ee3c98e0926b80f6f2150..2ccf9c22b2e9dee40858cb70a44763f4084e15da:/src/s4u/s4u_Actor.cpp?ds=sidebyside diff --git a/src/s4u/s4u_Actor.cpp b/src/s4u/s4u_Actor.cpp index f2d5612ca1..e6737e9342 100644 --- a/src/s4u/s4u_Actor.cpp +++ b/src/s4u/s4u_Actor.cpp @@ -41,7 +41,7 @@ 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; @@ -56,6 +56,15 @@ ActorPtr Actor::init(const std::string& name, s4u::Host* host) return actor->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) { simgrid::kernel::actor::simcall([this, &code] { pimpl_->start(code); }); @@ -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_); } }); } @@ -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); } @@ -318,7 +327,7 @@ 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()); @@ -361,7 +370,9 @@ void parallel_execute(const std::vector& hosts, const std::vectorset_flops_amount(flops_amount)->set_host(get_host()); + return exec; } ExecPtr exec_init(const std::vector& hosts, const std::vector& flops_amounts, @@ -387,7 +398,9 @@ ExecPtr exec_init(const std::vector& hosts, const std::vectorset_flops_amounts(flops_amounts)->set_bytes_amounts(bytes_amounts)->set_hosts(hosts); + return exec; } ExecPtr exec_async(double flops) @@ -458,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() +{ + 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) { @@ -472,11 +502,28 @@ void sg_actor_start(sg_actor_t actor, xbt_main_func_t code, int argc, const char actor->start(std::move(function)); } -/** @ingroup m_actor_management +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(); +} + +/** * @brief Returns the process ID of @a actor. * * This function checks whether @a actor is a valid pointer and return its PID (or 0 in case of problem). */ + aid_t sg_actor_get_PID(const_sg_actor_t actor) { /* Do not raise an exception here: this function is called by the logs @@ -486,7 +533,7 @@ aid_t sg_actor_get_PID(const_sg_actor_t actor) return actor->get_pid(); } -/** @ingroup m_actor_management +/** * @brief Returns the process ID of the parent of @a actor. * * This function checks whether @a actor is a valid pointer and return its parent's PID. @@ -497,8 +544,7 @@ aid_t sg_actor_get_PPID(const_sg_actor_t actor) return actor->get_ppid(); } -/** @ingroup m_actor_management - * +/** * @brief Return a #sg_actor_t given its PID. * * This function search in the list of all the created sg_actor_t for a sg_actor_t whose PID is equal to @a PID. @@ -510,9 +556,7 @@ sg_actor_t sg_actor_by_PID(aid_t pid) return simgrid::s4u::Actor::by_pid(pid).get(); } -/** @ingroup m_actor_management - * @brief Return the name of an actor. - */ +/** @brief Return the name of an actor. */ const char* sg_actor_get_name(const_sg_actor_t actor) { return actor->get_cname(); @@ -523,7 +567,7 @@ sg_host_t sg_actor_get_host(const_sg_actor_t actor) return actor->get_host(); } -/** @ingroup m_actor_management +/** * @brief Returns the value of a given actor property * * @param actor an actor @@ -535,7 +579,7 @@ const char* sg_actor_get_property_value(const_sg_actor_t actor, const char* name return actor->get_property(name); } -/** @ingroup m_actor_management +/** * @brief Return the list of properties * * This function returns all the parameters associated with an actor @@ -553,7 +597,7 @@ xbt_dict_t sg_actor_get_properties(const_sg_actor_t actor) return as_dict; } -/** @ingroup m_actor_management +/** * @brief Suspend the actor. * * This function suspends the actor by suspending the task on which it was waiting for the completion. @@ -564,7 +608,7 @@ void sg_actor_suspend(sg_actor_t actor) actor->suspend(); } -/** @ingroup m_actor_management +/** * @brief Resume a suspended actor. * * This function resumes a suspended actor by resuming the task on which it was waiting for the completion. @@ -575,7 +619,7 @@ void sg_actor_resume(sg_actor_t actor) actor->resume(); } -/** @ingroup m_actor_management +/** * @brief Returns true if the actor is suspended . * * This checks whether an actor is suspended or not by inspecting the task on which it was waiting for the completion. @@ -585,17 +629,13 @@ int sg_actor_is_suspended(sg_actor_t actor) return actor->is_suspended(); } -/** - * @ingroup m_actor_management - * @brief Restarts an actor from the beginning. - */ +/** @brief Restarts an actor from the beginning. */ sg_actor_t sg_actor_restart(sg_actor_t actor) { return actor->restart(); } /** - * @ingroup m_actor_management * @brief Sets the "auto-restart" flag of the actor. * If the flag is set to 1, the actor will be automatically restarted when its host comes back up. */ @@ -604,15 +644,19 @@ void sg_actor_set_auto_restart(sg_actor_t actor, int auto_restart) actor->set_auto_restart(auto_restart); } -/** @ingroup m_actor_management - * @brief This actor will be terminated automatically when the last non-daemon actor finishes - */ +/** @brief This actor will be terminated automatically when the last non-daemon actor finishes */ void sg_actor_daemonize(sg_actor_t actor) { actor->daemonize(); } -/** @ingroup m_actor_management +/** Returns whether or not this actor has been daemonized or not */ +int sg_actor_is_daemon(const_sg_actor_t actor) +{ + return actor->is_daemon(); +} + +/** * @brief Migrates an actor to another location. * * This function changes the value of the #sg_host_t on which @a actor is running. @@ -626,7 +670,7 @@ void sg_actor_migrate(sg_actor_t process, sg_host_t host) // deprecated process->set_host(host); } -/** @ingroup m_actor_management +/** * @brief Wait for the completion of a #sg_actor_t. * * @param actor the actor to wait for @@ -647,7 +691,7 @@ void sg_actor_kill_all() simgrid::s4u::Actor::kill_all(); } -/** @ingroup m_actor_management +/** * @brief Set the kill time of an actor. * * @param actor an actor @@ -669,6 +713,11 @@ void sg_actor_sleep_for(double duration) simgrid::s4u::this_actor::sleep_for(duration); } +void sg_actor_sleep_until(double wakeup_time) +{ + simgrid::s4u::this_actor::sleep_until(wakeup_time); +} + sg_actor_t sg_actor_attach(const char* name, void* data, sg_host_t host, xbt_dict_t properties) { xbt_assert(host != nullptr, "Invalid parameters: host and code params must not be nullptr"); @@ -727,10 +776,32 @@ sg_actor_t sg_actor_self() return simgrid::s4u::Actor::self(); } -void sg_actor_self_execute(double flops) +void sg_actor_self_execute(double flops) // XBT_DEPRECATED_v330 +{ + simgrid::s4u::this_actor::execute(flops); +} + +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) +{ + 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::this_actor::parallel_execute(hosts, flops, bytes); +} /** @brief Take an extra reference on that actor to prevent it to be garbage-collected */ void sg_actor_ref(const_sg_actor_t actor) @@ -753,3 +824,42 @@ void sg_actor_data_set(sg_actor_t actor, void* userdata) { actor->set_data(userdata); } +/** @brief Add a function to the list of "on_exit" functions for the current process. + * 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(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); }); +} + +sg_exec_t sg_actor_exec_init(double computation_amount) +{ + simgrid::s4u::ExecPtr exec = simgrid::s4u::this_actor::exec_init(computation_amount); + exec->add_ref(); + 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 = simgrid::s4u::ExecPtr(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); + exec->add_ref(); + return exec.get(); +}