X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5ed37babb2fa9097abe82df299c0aa259ed84d5a..8be89720f55b4ceeb2877531ae1602cc7ed947d6:/src/kernel/activity/ActivityImpl.cpp diff --git a/src/kernel/activity/ActivityImpl.cpp b/src/kernel/activity/ActivityImpl.cpp index b16a24b7c9..f1a9859319 100644 --- a/src/kernel/activity/ActivityImpl.cpp +++ b/src/kernel/activity/ActivityImpl.cpp @@ -44,15 +44,15 @@ void ActivityImpl::unregister_simcall(actor::Simcall* 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 @@ -108,6 +108,10 @@ 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 */ if (auto* comm = dynamic_cast(this)) { @@ -115,9 +119,9 @@ void ActivityImpl::wait_for(actor::ActorImpl* issuer, double timeout) sleep_action->set_activity(comm); if (issuer == comm->src_actor_) - comm->src_timeout_ = sleep_action; + comm->src_timeout_.reset(sleep_action); else - comm->dst_timeout_ = sleep_action; + comm->dst_timeout_.reset(sleep_action); } else { SynchroImplPtr synchro(new SynchroImpl([this, issuer]() { this->unregister_simcall(&issuer->simcall_); @@ -142,7 +146,7 @@ void ActivityImpl::wait_any_for(actor::ActorImpl* issuer, const std::vectorget_value(); idx != -1) { auto* act = activities.at(idx); - act->simcalls_.push_back(&issuer->simcall_); + act->register_simcall(&issuer->simcall_); observer->set_result(idx); act->set_state(State::DONE); act->finish(); @@ -164,7 +168,7 @@ void ActivityImpl::wait_any_for(actor::ActorImpl* issuer, const std::vectorsimcalls_.push_back(&issuer->simcall_); + act->register_simcall(&issuer->simcall_); /* see if the synchro is already finished */ if (act->get_state() != State::WAITING && act->get_state() != State::RUNNING) { act->finish(); @@ -176,27 +180,27 @@ void ActivityImpl::wait_any_for(actor::ActorImpl* issuer, const std::vectorget_remains()); - surf_action_->suspend(); - s4u::Activity::on_suspended(*get_iface()); + 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(); - s4u::Activity::on_resumed(*get_iface()); + 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; } @@ -236,4 +240,5 @@ void intrusive_ptr_release(ActivityImpl* activity) delete activity; } } + } // namespace simgrid::kernel::activity