X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3dd753cd9e46d794e00629d03183250aec4a17e4..021e27fc5af34eab44297b9a49a53a65b27f6865:/src/kernel/activity/ActivityImpl.cpp diff --git a/src/kernel/activity/ActivityImpl.cpp b/src/kernel/activity/ActivityImpl.cpp index 5618538298..015ca2064b 100644 --- a/src/kernel/activity/ActivityImpl.cpp +++ b/src/kernel/activity/ActivityImpl.cpp @@ -1,14 +1,15 @@ -/* Copyright (c) 2007-2022. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-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. */ #include +#include #include #include "src/kernel/activity/ActivityImpl.hpp" #include "src/kernel/activity/CommImpl.hpp" -#include "src/kernel/activity/SynchroRaw.hpp" +#include "src/kernel/activity/Synchro.hpp" #include "src/kernel/actor/ActorImpl.hpp" #include "src/kernel/actor/SimcallObserver.hpp" #include "src/kernel/resource/CpuImpl.hpp" @@ -19,9 +20,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(ker_activity, kernel, "Kernel activity-related synchronization"); -namespace simgrid { -namespace kernel { -namespace activity { +namespace simgrid::kernel::activity { ActivityImpl::~ActivityImpl() { @@ -29,13 +28,13 @@ ActivityImpl::~ActivityImpl() XBT_DEBUG("Destroy activity %p", this); } -void ActivityImpl::register_simcall(smx_simcall_t simcall) +void ActivityImpl::register_simcall(actor::Simcall* simcall) { simcalls_.push_back(simcall); simcall->issuer_->waiting_synchro_ = this; } -void ActivityImpl::unregister_simcall(smx_simcall_t simcall) +void ActivityImpl::unregister_simcall(actor::Simcall* simcall) { // Remove the first occurrence of simcall: auto j = boost::range::find(simcalls_, simcall); @@ -45,15 +44,15 @@ void ActivityImpl::unregister_simcall(smx_simcall_t simcall) void ActivityImpl::clean_action() { - if (surf_action_) { - surf_action_->unref(); - surf_action_ = nullptr; + if (model_action_) { + model_action_->unref(); + model_action_ = nullptr; } } double ActivityImpl::get_remaining() const { - return surf_action_ ? surf_action_->get_remains() : 0; + return model_action_ ? model_action_->get_remains() : 0; } const char* ActivityImpl::get_state_str() const @@ -63,23 +62,15 @@ const char* ActivityImpl::get_state_str() const bool ActivityImpl::test(actor::ActorImpl* issuer) { - // Associate this simcall to the synchro - auto* observer = dynamic_cast(issuer->simcall_.observer_); - if (observer) - register_simcall(&issuer->simcall_); - if (state_ != State::WAITING && state_ != State::RUNNING) { finish(); issuer->exception_ = nullptr; // Do not propagate exception in that case return true; } - if (observer) { + if (auto* observer = dynamic_cast(issuer->simcall_.observer_)) observer->set_result(false); - issuer->waiting_synchro_ = nullptr; - unregister_simcall(&issuer->simcall_); - issuer->simcall_answer(); - } + return false; } @@ -97,11 +88,9 @@ ssize_t ActivityImpl::test_any(actor::ActorImpl* issuer, const std::vectortest(issuer)) { observer->set_result(i); - issuer->simcall_answer(); return i; } } - issuer->simcall_answer(); return -1; } @@ -119,25 +108,28 @@ void ActivityImpl::wait_for(actor::ActorImpl* issuer, double timeout) if (state_ != State::WAITING && state_ != State::RUNNING) { finish(); } else { + /* As Messages in Message Queues are virtually instantaneous, we do not need a timeout */ + /* Or maybe we do, and will have to implement a specific way to handle them is need arises */ + if (dynamic_cast(this) != nullptr) + return; /* we need a sleep action (even when the timeout is infinite) to be notified of host failures */ /* Comms handle that a bit differently of the other activities */ - auto* comm = dynamic_cast(this); - if (comm != nullptr) { - resource::Action* sleep = issuer->get_host()->get_cpu()->sleep(timeout); - sleep->set_activity(comm); + if (auto* comm = dynamic_cast(this)) { + resource::Action* sleep_action = issuer->get_host()->get_cpu()->sleep(timeout); + sleep_action->set_activity(comm); if (issuer == comm->src_actor_) - comm->src_timeout_ = sleep; + comm->src_timeout_.reset(sleep_action); else - comm->dst_timeout_ = sleep; + comm->dst_timeout_.reset(sleep_action); } else { - RawImplPtr synchro(new RawImpl([this, issuer]() { + SynchroImplPtr synchro(new SynchroImpl([this, issuer]() { this->unregister_simcall(&issuer->simcall_); issuer->waiting_synchro_ = nullptr; issuer->exception_ = nullptr; auto* observer = dynamic_cast(issuer->simcall_.observer_); xbt_assert(observer != nullptr); - observer->set_result(true); + observer->set_result(true); // Returns that the wait_for timeouted })); synchro->set_host(issuer->get_host()).set_timeout(timeout).start(); synchro->register_simcall(&issuer->simcall_); @@ -152,12 +144,13 @@ void ActivityImpl::wait_any_for(actor::ActorImpl* issuer, const std::vector(issuer->simcall_.observer_); xbt_assert(observer != nullptr); xbt_assert(timeout <= 0.0, "Timeout not implemented for waitany in the model-checker"); - int idx = observer->get_value(); - auto* act = activities[idx]; - act->simcalls_.push_back(&issuer->simcall_); - observer->set_result(idx); - act->set_state(State::DONE); - act->finish(); + if (int idx = observer->get_value(); idx != -1) { + auto* act = activities.at(idx); + act->simcalls_.push_back(&issuer->simcall_); + observer->set_result(idx); + act->set_state(State::DONE); + act->finish(); + } return; } @@ -187,31 +180,31 @@ void ActivityImpl::wait_any_for(actor::ActorImpl* issuer, const std::vectorget_remains()); - surf_action_->suspend(); - on_suspended(*this); + XBT_VERB("This activity is suspended (remain: %f)", model_action_->get_remains()); + get_iface()->fire_on_suspend(); + get_iface()->fire_on_this_suspend(); + model_action_->suspend(); } void ActivityImpl::resume() { - if (surf_action_ == nullptr) + if (model_action_ == nullptr) return; - XBT_VERB("This activity is resumed (remain: %f)", surf_action_->get_remains()); - surf_action_->resume(); - on_resumed(*this); + XBT_VERB("This activity is resumed (remain: %f)", model_action_->get_remains()); + get_iface()->fire_on_resume(); + get_iface()->fire_on_this_resume(); + model_action_->resume(); } void ActivityImpl::cancel() { XBT_VERB("Activity %p is canceled", this); - if (surf_action_ != nullptr) - surf_action_->cancel(); + if (model_action_ != nullptr) + model_action_->cancel(); state_ = State::CANCELED; } -void ActivityImpl::handle_activity_waitany(smx_simcall_t simcall) +void ActivityImpl::handle_activity_waitany(actor::Simcall* simcall) { /* If a waitany simcall is waiting for this synchro to finish, then remove it from the other synchros in the waitany * list. Afterwards, get the position of the actual synchro in the waitany list and return it as the result of the @@ -229,7 +222,6 @@ void ActivityImpl::handle_activity_waitany(smx_simcall_t simcall) if (not MC_is_active() && not MC_record_replay_is_active()) { auto element = std::find(activities.begin(), activities.end(), this); int rank = element != activities.end() ? static_cast(std::distance(activities.begin(), element)) : -1; - auto* observer = dynamic_cast(simcall->observer_); observer->set_result(rank); } } @@ -248,8 +240,5 @@ void intrusive_ptr_release(ActivityImpl* activity) delete activity; } } -xbt::signal ActivityImpl::on_resumed; -xbt::signal ActivityImpl::on_suspended; -} -} -} // namespace simgrid::kernel::activity:: + +} // namespace simgrid::kernel::activity