X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/97e2219ed6c0e511f6165460cec79afadf42f589..a7cc502f224afb96f0203b94759cd0dabebf8de5:/src/s4u/s4u_Actor.cpp diff --git a/src/s4u/s4u_Actor.cpp b/src/s4u/s4u_Actor.cpp index 372470bb86..573d708555 100644 --- a/src/s4u/s4u_Actor.cpp +++ b/src/s4u/s4u_Actor.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2006-2022. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2006-2023. 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,11 +11,11 @@ #include #include -#include "src/include/mc/mc.h" #include "src/kernel/EngineImpl.hpp" #include "src/kernel/actor/ActorImpl.hpp" +#include "src/kernel/resource/HostImpl.hpp" +#include "src/mc/mc.h" #include "src/mc/mc_replay.hpp" -#include "src/surf/HostImpl.hpp" #include @@ -108,20 +108,21 @@ 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->wannadie()) { - // The joined actor is already finished, just wake up the issuer right away - issuer->simcall_answer(); - } else { - kernel::activity::ActivityImplPtr sync = issuer->join(target, timeout); - sync->register_simcall(&issuer->simcall_); - } - }); + kernel::actor::ActorJoinSimcall observer{issuer, get_impl(), timeout}; + + kernel::actor::simcall_blocking( + [issuer, target, timeout] { + if (target->wannadie()) { + // The joined actor is already finished, just wake up the issuer right away + issuer->simcall_answer(); + } else { + kernel::activity::ActivityImplPtr sync = issuer->join(target, timeout); + sync->register_simcall(&issuer->simcall_); + } + }, + &observer); } Actor* Actor::set_auto_restart(bool autorestart) @@ -163,6 +164,7 @@ void Actor::set_host(Host* new_host) }); s4u::Actor::on_host_change(*this, *previous_location); + s4u::Actor::on_this_host_change(*this, *previous_location); } s4u::Host* Actor::get_host() const @@ -187,7 +189,7 @@ bool Actor::is_maestro() return self == nullptr || kernel::EngineImpl::get_instance()->is_maestro(self); } -const simgrid::xbt::string& Actor::get_name() const +const std::string& Actor::get_name() const { return this->pimpl_->get_name(); } @@ -212,6 +214,7 @@ void Actor::suspend() kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self(); kernel::actor::ActorImpl* target = pimpl_; s4u::Actor::on_suspend(*this); + s4u::Actor::on_this_suspend(*this); kernel::actor::simcall_blocking([issuer, target]() { target->suspend(); if (target != issuer) { @@ -225,6 +228,7 @@ void Actor::resume() { kernel::actor::simcall_answered([this] { pimpl_->resume(); }); s4u::Actor::on_resume(*this); + s4u::Actor::on_this_resume(*this); } bool Actor::is_suspended() const @@ -312,31 +316,37 @@ void sleep_for(double duration) if (duration <= 0) /* that's a no-op */ return; - if (duration < sg_surf_precision) { + if (duration < sg_precision_timing) { static unsigned int warned = 0; // At most 20 such warnings warned++; if (warned <= 20) XBT_INFO("The parameter to sleep_for() is smaller than the SimGrid numerical accuracy (%g < %g). " "Please refer to https://simgrid.org/doc/latest/Configuring_SimGrid.html#numerical-precision", - duration, sg_surf_precision); + duration, sg_precision_timing); if (warned == 20) XBT_VERB("(further warnings about the numerical accuracy of sleep_for() will be omitted)."); } kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self(); - Actor::on_sleep(*issuer->get_ciface()); + kernel::actor::ActorSleepSimcall observer(issuer); - kernel::actor::simcall_blocking([issuer, duration]() { - if (MC_is_active() || MC_record_replay_is_active()) { - MC_process_clock_add(issuer, duration); - issuer->simcall_answer(); - return; - } - kernel::activity::ActivityImplPtr sync = issuer->sleep(duration); - sync->register_simcall(&issuer->simcall_); - }); + Actor::on_sleep(*issuer->get_ciface()); + issuer->get_ciface()->on_this_sleep(*issuer->get_ciface()); + + kernel::actor::simcall_blocking( + [issuer, duration]() { + if (MC_is_active() || MC_record_replay_is_active()) { + // MC_process_clock_add(issuer, duration); // BUG: Makes the exploration loop + issuer->simcall_answer(); + } else { + kernel::activity::ActivityImplPtr sync = issuer->sleep(duration); + sync->register_simcall(&issuer->simcall_); + } + }, + &observer); Actor::on_wake_up(*issuer->get_ciface()); + issuer->get_ciface()->on_this_wake_up(*issuer->get_ciface()); } void yield() @@ -358,7 +368,7 @@ void execute(double flops) void execute(double flops, double priority) { - exec_init(flops)->set_priority(priority)->vetoable_start()->wait(); + exec_init(flops)->set_priority(priority)->start()->wait(); } void parallel_execute(const std::vector& hosts, const std::vector& flops_amounts, @@ -406,13 +416,14 @@ ExecPtr exec_init(const std::vector& hosts, const std::vectorvetoable_start(); + res->start(); return res; } aid_t get_pid() { - return simgrid::kernel::actor::ActorImpl::self()->get_pid(); + const auto* self = simgrid::kernel::actor::ActorImpl::self(); + return self ? self->get_pid() : 0; } aid_t get_ppid() @@ -427,7 +438,8 @@ std::string get_name() const char* get_cname() { - return simgrid::kernel::actor::ActorImpl::self()->get_cname(); + const auto* self = simgrid::kernel::actor::ActorImpl::self(); + return self ? self->get_cname() : nullptr; } Host* get_host() @@ -439,6 +451,7 @@ void suspend() { kernel::actor::ActorImpl* self = simgrid::kernel::actor::ActorImpl::self(); s4u::Actor::on_suspend(*self->get_ciface()); + self->get_ciface()->on_this_suspend(*self->get_ciface()); kernel::actor::simcall_blocking([self] { self->suspend(); }); } @@ -588,8 +601,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; } @@ -752,6 +765,8 @@ aid_t sg_actor_self_get_ppid() const char* sg_actor_self_get_name() { + if (simgrid::s4u::Actor::is_maestro()) + return "maestro"; return simgrid::s4u::this_actor::get_cname(); }