X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7b6fecb801d2d513ebbd7bea94c52322e2cc1df2..cfcdf2e0866cb50cace1db634430d0861af5f0a1:/src/s4u/s4u_Actor.cpp diff --git a/src/s4u/s4u_Actor.cpp b/src/s4u/s4u_Actor.cpp index df7dc2d058..70e3706975 100644 --- a/src/s4u/s4u_Actor.cpp +++ b/src/s4u/s4u_Actor.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2006-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2006-2020. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -11,6 +11,7 @@ #include "simgrid/s4u/Host.hpp" #include "simgrid/s4u/VirtualMachine.hpp" #include "src/include/mc/mc.h" +#include "src/kernel/EngineImpl.hpp" #include "src/kernel/activity/ExecImpl.hpp" #include "src/mc/mc_replay.hpp" #include "src/surf/HostImpl.hpp" @@ -21,6 +22,9 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_actor, s4u, "S4U actors"); namespace simgrid { + +template class xbt::Extendable; + namespace s4u { xbt::signal s4u::Actor::on_creation; @@ -70,15 +74,16 @@ ActorPtr Actor::create(const std::string& name, s4u::Host* host, const std::func ActorPtr Actor::create(const std::string& name, s4u::Host* host, const std::string& function, std::vector args) { - const simix::ActorCodeFactory& factory = SIMIX_get_actor_code_factory(function); + const simgrid::kernel::actor::ActorCodeFactory& factory = + simgrid::kernel::EngineImpl::get_instance()->get_function(function); return create(name, host, factory(std::move(args))); } -void intrusive_ptr_add_ref(Actor* actor) +void intrusive_ptr_add_ref(const Actor* actor) { intrusive_ptr_add_ref(actor->pimpl_); } -void intrusive_ptr_release(Actor* actor) +void intrusive_ptr_release(const Actor* actor) { intrusive_ptr_release(actor->pimpl_); } @@ -103,7 +108,7 @@ void Actor::join(double timeout) // The joined process is already finished, just wake up the issuer right away issuer->simcall_answer(); } else { - smx_activity_t sync = issuer->join(target, timeout); + kernel::activity::ActivityImplPtr sync = issuer->join(target, timeout); sync->register_simcall(&issuer->simcall); } }); @@ -312,7 +317,7 @@ void sleep_for(double duration) issuer->simcall_answer(); return; } - smx_activity_t sync = issuer->sleep(duration); + kernel::activity::ActivityImplPtr sync = issuer->sleep(duration); sync->register_simcall(&issuer->simcall); }); @@ -356,7 +361,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, @@ -382,7 +389,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) @@ -424,13 +433,6 @@ void suspend() kernel::actor::simcall_blocking([self] { self->suspend(); }); } -void resume() -{ - kernel::actor::ActorImpl* self = simgrid::kernel::actor::ActorImpl::self(); - kernel::actor::simcall([self] { self->resume(); }); - Actor::on_resume(*self->ciface()); -} - void exit() { kernel::actor::ActorImpl* self = simgrid::kernel::actor::ActorImpl::self(); @@ -466,20 +468,26 @@ sg_actor_t sg_actor_init(const char* name, sg_host_t host) return simgrid::s4u::Actor::init(name, host).get(); } -void sg_actor_start(sg_actor_t actor, xbt_main_func_t code, int argc, char** argv) +void sg_actor_start(sg_actor_t actor, xbt_main_func_t code, int argc, const char* const* argv) { - simgrid::simix::ActorCode function; + simgrid::kernel::actor::ActorCode function; if (code) - function = simgrid::xbt::wrap_main(code, argc, static_cast(argv)); + function = simgrid::xbt::wrap_main(code, argc, argv); actor->start(std::move(function)); } -/** @ingroup m_actor_management +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(sg_actor_t actor) + +aid_t sg_actor_get_PID(const_sg_actor_t actor) { /* Do not raise an exception here: this function is called by the logs * and the exceptions, so it would be called back again and again */ @@ -488,19 +496,18 @@ aid_t sg_actor_get_PID(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. * Returns -1 if the actor has not been created by any other actor. */ -aid_t sg_actor_get_PPID(sg_actor_t actor) +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. @@ -512,37 +519,35 @@ 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. - */ -const char* sg_actor_get_name(sg_actor_t actor) +/** @brief Return the name of an actor. */ +const char* sg_actor_get_name(const_sg_actor_t actor) { return actor->get_cname(); } -sg_host_t sg_actor_get_host(sg_actor_t actor) +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 * @param name a property name * @return value of a property (or nullptr if the property is not set) */ -const char* sg_actor_get_property_value(sg_actor_t actor, const char* name) +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 */ -xbt_dict_t sg_actor_get_properties(sg_actor_t actor) +xbt_dict_t sg_actor_get_properties(const_sg_actor_t actor) { xbt_assert(actor != nullptr, "Invalid parameter: First argument must not be nullptr"); xbt_dict_t as_dict = xbt_dict_new_homogeneous(xbt_free_f); @@ -555,7 +560,7 @@ xbt_dict_t sg_actor_get_properties(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. @@ -566,7 +571,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. @@ -577,7 +582,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. @@ -587,17 +592,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. */ @@ -606,15 +607,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(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. @@ -628,7 +633,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 @@ -649,7 +654,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 @@ -671,6 +676,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"); @@ -735,12 +745,12 @@ void sg_actor_self_execute(double flops) } /** @brief Take an extra reference on that actor to prevent it to be garbage-collected */ -void sg_actor_ref(sg_actor_t actor) +void sg_actor_ref(const_sg_actor_t actor) { intrusive_ptr_add_ref(actor); } /** @brief Release a reference on that actor so that it can get be garbage-collected */ -void sg_actor_unref(sg_actor_t actor) +void sg_actor_unref(const_sg_actor_t actor) { intrusive_ptr_release(actor); } @@ -755,3 +765,11 @@ 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(int_f_int_pvoid_t fun, void* data) +{ + simgrid::s4u::this_actor::on_exit([fun, data](bool failed) { fun(failed ? 1 /*FAILURE*/ : 0 /*SUCCESS*/, data); }); +}