X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/31c0fb4e9b5d20d58c57f13b1bece0e6b94f4ac8..dc6258583c78a558d0bfc6d317272810e1b278ac:/src/s4u/s4u_Actor.cpp diff --git a/src/s4u/s4u_Actor.cpp b/src/s4u/s4u_Actor.cpp index f092fc8cb7..9069f5ecca 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. */ @@ -18,9 +18,12 @@ #include #include -XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_actor, "S4U actors"); +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_actor, s4u, "S4U actors"); namespace simgrid { + +template class xbt::Extendable; + namespace s4u { xbt::signal s4u::Actor::on_creation; @@ -28,8 +31,9 @@ xbt::signal s4u::Actor::on_suspend; xbt::signal s4u::Actor::on_resume; xbt::signal s4u::Actor::on_sleep; xbt::signal s4u::Actor::on_wake_up; -xbt::signal s4u::Actor::on_migration_start; -xbt::signal s4u::Actor::on_migration_end; +xbt::signal s4u::Actor::on_migration_start; // deprecated +xbt::signal s4u::Actor::on_migration_end; // deprecated +xbt::signal s4u::Actor::on_host_change; xbt::signal s4u::Actor::on_termination; xbt::signal s4u::Actor::on_destruction; @@ -45,7 +49,7 @@ Actor* Actor::self() ActorPtr Actor::init(const std::string& name, s4u::Host* host) { - kernel::actor::ActorImpl* self = SIMIX_process_self(); + 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(); @@ -59,7 +63,7 @@ ActorPtr Actor::start(const std::function& code) ActorPtr Actor::create(const std::string& name, s4u::Host* host, const std::function& code) { - kernel::actor::ActorImpl* self = SIMIX_process_self(); + kernel::actor::ActorImpl* self = kernel::actor::ActorImpl::self(); kernel::actor::ActorImpl* actor = kernel::actor::simcall([self, &name, host, &code] { return self->init(name, host)->start(code); }); @@ -69,15 +73,15 @@ 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) { - simix::ActorCodeFactory& factory = SIMIX_get_actor_code_factory(function); + const simix::ActorCodeFactory& factory = SIMIX_get_actor_code_factory(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_); } @@ -95,7 +99,7 @@ void Actor::join() void Actor::join(double timeout) { - kernel::actor::ActorImpl* issuer = SIMIX_process_self(); + kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self(); kernel::actor::ActorImpl* target = pimpl_; kernel::actor::simcall_blocking([issuer, target, timeout] { if (target->finished_) { @@ -122,12 +126,22 @@ void Actor::set_auto_restart(bool autorestart) void Actor::on_exit(const std::function& fun) const { - kernel::actor::simcall([this, &fun] { SIMIX_process_on_exit(pimpl_, fun); }); + kernel::actor::simcall([this, &fun] { pimpl_->on_exit->emplace_back(fun); }); } -void Actor::migrate(Host* new_host) +void Actor::set_host(Host* new_host) { - s4u::Actor::on_migration_start(*this); + if (s4u::Actor::on_migration_start.get_slot_count() > 0) { // XBT_ATTRIB_DEPRECATED_v329 + static bool already_warned = false; + if (not already_warned) { + XBT_INFO("Please use s4u::Actor::on_host_change instead of s4u::Actor::on_migration_start. This will be removed " + "in v3.29"); + already_warned = true; + } + s4u::Actor::on_migration_start(*this); + } + + const s4u::Host* previous_location = get_host(); kernel::actor::simcall([this, new_host]() { if (pimpl_->waiting_synchro != nullptr) { @@ -141,7 +155,17 @@ void Actor::migrate(Host* new_host) this->pimpl_->set_host(new_host); }); - s4u::Actor::on_migration_end(*this); + if (s4u::Actor::on_migration_end.get_slot_count() > 0) { // XBT_ATTRIB_DEPRECATED_v329 + static bool already_warned = false; + if (not already_warned) { + XBT_INFO("Please use s4u::Actor::on_host_change instead of s4u::Actor::on_migration_end. This will be removed in " + "v3.29"); + already_warned = true; + } + s4u::Actor::on_migration_end(*this); + } + + s4u::Actor::on_host_change(*this, *previous_location); } s4u::Host* Actor::get_host() const @@ -181,7 +205,7 @@ aid_t Actor::get_ppid() const void Actor::suspend() { - kernel::actor::ActorImpl* issuer = SIMIX_process_self(); + kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self(); kernel::actor::ActorImpl* target = pimpl_; s4u::Actor::on_suspend(*this); kernel::actor::simcall_blocking([issuer, target]() { @@ -217,7 +241,7 @@ double Actor::get_kill_time() void Actor::kill() { - kernel::actor::ActorImpl* self = SIMIX_process_self(); + kernel::actor::ActorImpl* self = kernel::actor::ActorImpl::self(); kernel::actor::simcall([this, self] { self->kill(pimpl_); }); } @@ -234,7 +258,7 @@ ActorPtr Actor::by_pid(aid_t pid) void Actor::kill_all() { - kernel::actor::ActorImpl* self = SIMIX_process_self(); + kernel::actor::ActorImpl* self = kernel::actor::ActorImpl::self(); kernel::actor::simcall([self] { self->kill_all(); }); } @@ -282,7 +306,7 @@ void sleep_for(double duration) xbt_assert(std::isfinite(duration), "duration is not finite!"); if (duration > 0) { - kernel::actor::ActorImpl* issuer = SIMIX_process_self(); + kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self(); Actor::on_sleep(*issuer->ciface()); kernel::actor::simcall_blocking([issuer, duration]() { @@ -324,11 +348,22 @@ void execute(double flops, double priority) void parallel_execute(const std::vector& hosts, const std::vector& flops_amounts, const std::vector& bytes_amounts) { - parallel_execute(hosts, flops_amounts, bytes_amounts, -1); + exec_init(hosts, flops_amounts, bytes_amounts)->wait(); } void parallel_execute(const std::vector& hosts, const std::vector& flops_amounts, - const std::vector& bytes_amounts, double timeout) + const std::vector& bytes_amounts, double timeout) // XBT_ATTRIB_DEPRECATED_v329 +{ + exec_init(hosts, flops_amounts, bytes_amounts)->wait_for(timeout); +} + +ExecPtr exec_init(double flops_amount) +{ + return ExecPtr(new ExecSeq(get_host(), flops_amount)); +} + +ExecPtr exec_init(const std::vector& hosts, const std::vector& flops_amounts, + const std::vector& bytes_amounts) { xbt_assert(hosts.size() > 0, "Your parallel executions must span over at least one host."); xbt_assert(hosts.size() == flops_amounts.size() || flops_amounts.empty(), @@ -350,17 +385,6 @@ void parallel_execute(const std::vector& hosts, const std::vectorset_timeout(timeout)->wait(); -} - -ExecPtr exec_init(double flops_amount) -{ - return ExecPtr(new ExecSeq(get_host(), flops_amount)); -} - -ExecPtr exec_init(const std::vector& hosts, const std::vector& flops_amounts, - const std::vector& bytes_amounts) -{ return ExecPtr(new ExecPar(hosts, flops_amounts, bytes_amounts)); } @@ -373,61 +397,58 @@ ExecPtr exec_async(double flops) aid_t get_pid() { - return SIMIX_process_self()->get_pid(); + return simgrid::kernel::actor::ActorImpl::self()->get_pid(); } aid_t get_ppid() { - return SIMIX_process_self()->get_ppid(); + return simgrid::kernel::actor::ActorImpl::self()->get_ppid(); } std::string get_name() { - return SIMIX_process_self()->get_name(); + return simgrid::kernel::actor::ActorImpl::self()->get_name(); } const char* get_cname() { - return SIMIX_process_self()->get_cname(); + return simgrid::kernel::actor::ActorImpl::self()->get_cname(); } Host* get_host() { - return SIMIX_process_self()->get_host(); + return simgrid::kernel::actor::ActorImpl::self()->get_host(); } void suspend() { - kernel::actor::ActorImpl* self = SIMIX_process_self(); + kernel::actor::ActorImpl* self = simgrid::kernel::actor::ActorImpl::self(); s4u::Actor::on_suspend(*self->ciface()); kernel::actor::simcall_blocking([self] { self->suspend(); }); } -void resume() -{ - kernel::actor::ActorImpl* self = SIMIX_process_self(); - kernel::actor::simcall([self] { self->resume(); }); - Actor::on_resume(*self->ciface()); -} - void exit() { - kernel::actor::ActorImpl* self = SIMIX_process_self(); + kernel::actor::ActorImpl* self = simgrid::kernel::actor::ActorImpl::self(); simgrid::kernel::actor::simcall([self] { self->exit(); }); } void on_exit(const std::function& fun) { - SIMIX_process_self()->iface()->on_exit(fun); + simgrid::kernel::actor::ActorImpl::self()->iface()->on_exit(fun); } /** @brief Moves the current actor to another host * * @see simgrid::s4u::Actor::migrate() for more information */ -void migrate(Host* new_host) +void set_host(Host* new_host) { - SIMIX_process_self()->iface()->migrate(new_host); + simgrid::kernel::actor::ActorImpl::self()->iface()->set_host(new_host); +} +void migrate(Host* new_host) // deprecated +{ + set_host(new_host); } } // namespace this_actor @@ -454,7 +475,7 @@ void sg_actor_start(sg_actor_t actor, xbt_main_func_t code, int argc, char** arg * * 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 */ @@ -469,7 +490,7 @@ aid_t sg_actor_get_PID(sg_actor_t 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(); } @@ -490,12 +511,12 @@ sg_actor_t sg_actor_by_PID(aid_t pid) /** @ingroup m_actor_management * @brief Return the name of an actor. */ -const char* sg_actor_get_name(sg_actor_t 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(); } @@ -507,7 +528,7 @@ sg_host_t sg_actor_get_host(sg_actor_t 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); } @@ -517,7 +538,7 @@ const char* sg_actor_get_property_value(sg_actor_t actor, const char* name) * * 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); @@ -594,9 +615,13 @@ void sg_actor_daemonize(sg_actor_t actor) * * This function changes the value of the #sg_host_t on which @a actor is running. */ -void sg_actor_migrate(sg_actor_t process, sg_host_t host) +void sg_actor_set_host(sg_actor_t actor, sg_host_t host) { - process->migrate(host); + actor->set_host(host); +} +void sg_actor_migrate(sg_actor_t process, sg_host_t host) // deprecated +{ + process->set_host(host); } /** @ingroup m_actor_management @@ -685,6 +710,16 @@ const char* sg_actor_self_get_name() return simgrid::s4u::this_actor::get_cname(); } +void* sg_actor_self_data() +{ + return simgrid::s4u::Actor::self()->get_data(); +} + +void sg_actor_self_data_set(void* userdata) +{ + simgrid::s4u::Actor::self()->set_data(userdata); +} + sg_actor_t sg_actor_self() { return simgrid::s4u::Actor::self(); @@ -696,12 +731,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); }