X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9856e530871afa8c75fda68ab7cbc718e9ba7e95..321102577020b194dfb7ba89e48687952816849e:/src/s4u/s4u_Actor.cpp diff --git a/src/s4u/s4u_Actor.cpp b/src/s4u/s4u_Actor.cpp index bc9956a428..8c0fc2e679 100644 --- a/src/s4u/s4u_Actor.cpp +++ b/src/s4u/s4u_Actor.cpp @@ -14,7 +14,6 @@ #include "src/include/mc/mc.h" #include "src/kernel/EngineImpl.hpp" #include "src/kernel/actor/ActorImpl.hpp" -#include "src/kernel/context/Context.hpp" #include "src/mc/mc_replay.hpp" #include "src/surf/HostImpl.hpp" @@ -51,7 +50,7 @@ ActorPtr Actor::init(const std::string& name, s4u::Host* host) { const kernel::actor::ActorImpl* self = kernel::actor::ActorImpl::self(); kernel::actor::ActorImpl* actor = - kernel::actor::simcall([self, &name, host] { return self->init(name, host).get(); }); + kernel::actor::simcall_answered([self, &name, host] { return self->init(name, host).get(); }); return actor->get_iface(); } @@ -66,7 +65,7 @@ ActorPtr Actor::set_stacksize(unsigned stacksize) ActorPtr Actor::start(const std::function& code) { - simgrid::kernel::actor::simcall([this, &code] { pimpl_->start(code); }); + simgrid::kernel::actor::simcall_answered([this, &code] { pimpl_->start(code); }); return this; } @@ -74,7 +73,7 @@ ActorPtr Actor::create(const std::string& name, s4u::Host* host, const std::func { const 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); }); + kernel::actor::simcall_answered([self, &name, host, &code] { return self->init(name, host)->start(code); }); return actor->get_iface(); } @@ -109,10 +108,13 @@ void Actor::join() const void Actor::join(double timeout) const { + xbt_assert(not(MC_is_active() || MC_record_replay_is_active()), + "Actor::join() is not usable in MC yet. Please report this bug."); + kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self(); const kernel::actor::ActorImpl* target = pimpl_; kernel::actor::simcall_blocking([issuer, target, timeout] { - if (target->finished_) { + if (target->wannadie()) { // The joined actor is already finished, just wake up the issuer right away issuer->simcall_answer(); } else { @@ -122,28 +124,36 @@ void Actor::join(double timeout) const }); } -void Actor::set_auto_restart(bool autorestart) +Actor* Actor::set_auto_restart(bool autorestart) { - kernel::actor::simcall([this, autorestart]() { - xbt_assert(autorestart && not pimpl_->has_to_auto_restart()); // FIXME: handle all cases + if (autorestart == pimpl_->has_to_auto_restart()) // not changed + return this; + + kernel::actor::simcall_answered([this, autorestart]() { + xbt_assert(autorestart, "Asking an actor to stop being autorestart is not implemented yet. Ask us if you need it."); pimpl_->set_auto_restart(autorestart); 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()->get_impl()->add_actor_at_boot(arg); }); + return this; +} +int Actor::get_restart_count() const +{ + return pimpl_->get_restart_count(); } void Actor::on_exit(const std::function& fun) const { - kernel::actor::simcall([this, &fun] { pimpl_->on_exit->emplace_back(fun); }); + kernel::actor::simcall_answered([this, &fun] { pimpl_->on_exit->emplace_back(fun); }); } void Actor::set_host(Host* new_host) { const s4u::Host* previous_location = get_host(); - kernel::actor::simcall([this, new_host]() { + kernel::actor::simcall_answered([this, new_host]() { for (auto const& activity : pimpl_->activities_) { // FIXME: implement the migration of other kinds of activities if (auto exec = boost::dynamic_pointer_cast(activity)) @@ -160,9 +170,10 @@ s4u::Host* Actor::get_host() const return this->pimpl_->get_host(); } -void Actor::daemonize() +Actor* Actor::daemonize() { - kernel::actor::simcall([this]() { pimpl_->daemonize(); }); + kernel::actor::simcall_answered([this]() { pimpl_->daemonize(); }); + return this; } bool Actor::is_daemon() const @@ -212,7 +223,7 @@ void Actor::suspend() void Actor::resume() { - kernel::actor::simcall([this] { pimpl_->resume(); }); + kernel::actor::simcall_answered([this] { pimpl_->resume(); }); s4u::Actor::on_resume(*this); } @@ -223,7 +234,7 @@ bool Actor::is_suspended() const void Actor::set_kill_time(double kill_time) { - kernel::actor::simcall([this, kill_time] { pimpl_->set_kill_time(kill_time); }); + kernel::actor::simcall_answered([this, kill_time] { pimpl_->set_kill_time(kill_time); }); } /** @brief Get the kill time of an actor(or 0 if unset). */ @@ -235,14 +246,14 @@ double Actor::get_kill_time() const void Actor::kill() { const kernel::actor::ActorImpl* self = kernel::actor::ActorImpl::self(); - kernel::actor::simcall([this, self] { self->kill(pimpl_); }); + kernel::actor::simcall_answered([this, self] { self->kill(pimpl_); }); } // ***** Static functions ***** ActorPtr Actor::by_pid(aid_t pid) { - kernel::actor::ActorImpl* actor = kernel::actor::ActorImpl::by_pid(pid); + kernel::actor::ActorImpl* actor = kernel::EngineImpl::get_instance()->get_actor_by_pid(pid); if (actor != nullptr) return actor->get_iface(); else @@ -252,7 +263,7 @@ ActorPtr Actor::by_pid(aid_t pid) void Actor::kill_all() { const kernel::actor::ActorImpl* self = kernel::actor::ActorImpl::self(); - kernel::actor::simcall([self] { self->kill_all(); }); + kernel::actor::simcall_answered([self] { self->kill_all(); }); } const std::unordered_map* Actor::get_properties() const @@ -268,12 +279,12 @@ const char* Actor::get_property(const std::string& key) const void Actor::set_property(const std::string& key, const std::string& value) { - kernel::actor::simcall([this, &key, &value] { pimpl_->set_property(key, value); }); + kernel::actor::simcall_answered([this, &key, &value] { pimpl_->set_property(key, value); }); } Actor* Actor::restart() { - return kernel::actor::simcall([this]() { return pimpl_->restart(); }); + return kernel::actor::simcall_answered([this]() { return pimpl_->restart(); }); } // ***** this_actor ***** @@ -330,7 +341,7 @@ void sleep_for(double duration) void yield() { - kernel::actor::simcall([] { /* do nothing*/ }); + kernel::actor::simcall_answered([] { /* do nothing*/ }); } XBT_PUBLIC void sleep_until(double wakeup_time) @@ -356,6 +367,11 @@ void parallel_execute(const std::vector& hosts, const std::vectorwait(); } +void thread_execute(s4u::Host* host, double flops_amount, int thread_count) +{ + Exec::init()->set_flops_amount(flops_amount)->set_host(host)->set_thread_count(thread_count)->wait(); +} + ExecPtr exec_init(double flops_amount) { return Exec::init()->set_flops_amount(flops_amount)->set_host(get_host()); @@ -429,7 +445,7 @@ void suspend() void exit() { kernel::actor::ActorImpl* self = simgrid::kernel::actor::ActorImpl::self(); - simgrid::kernel::actor::simcall([self] { self->exit(); }); + simgrid::kernel::actor::simcall_answered([self] { self->exit(); }); THROW_IMPOSSIBLE; } @@ -572,8 +588,8 @@ xbt_dict_t sg_actor_get_properties(const_sg_actor_t actor) const std::unordered_map* props = actor->get_properties(); if (props == nullptr) return nullptr; - for (auto const& kv : *props) { - xbt_dict_set(as_dict, kv.first.c_str(), xbt_strdup(kv.second.c_str())); + for (auto const& [key, value] : *props) { + xbt_dict_set(as_dict, key.c_str(), xbt_strdup(value.c_str())); } return as_dict; } @@ -707,7 +723,7 @@ sg_actor_t sg_actor_attach(const char* name, void* data, sg_host_t host, xbt_dic xbt_dict_free(&properties); /* Let's create the actor: SIMIX may decide to start it right now, even before returning the flow control to us */ - smx_actor_t actor = nullptr; + simgrid::kernel::actor::ActorImpl* actor = nullptr; try { actor = simgrid::kernel::actor::ActorImpl::attach(name, data, host).get(); actor->set_properties(props);