X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e59357ba4f93c5bca3121f386f00e1cea7429a0d..596e36117322c22fd31372e7803bc197bcd4a016:/src/kernel/activity/ExecImpl.cpp diff --git a/src/kernel/activity/ExecImpl.cpp b/src/kernel/activity/ExecImpl.cpp index d7368f613c..a05e00c29c 100644 --- a/src/kernel/activity/ExecImpl.cpp +++ b/src/kernel/activity/ExecImpl.cpp @@ -71,6 +71,7 @@ ExecImpl* ExecImpl::start() set_state(State::RUNNING); if (not MC_is_active() && not MC_record_replay_is_active()) { if (get_hosts().size() == 1) { + xbt_assert(not flops_amounts_.empty(), "Cannot start Exec: no flops_amount defined."); if (thread_count_ == 1) { model_action_ = get_host()->get_cpu()->execution_start(flops_amounts_.front(), bound_); model_action_->set_sharing_penalty(sharing_penalty_); @@ -133,31 +134,6 @@ ExecImpl& ExecImpl::update_sharing_penalty(double sharing_penalty) return *this; } -void ExecImpl::post() -{ - xbt_assert(model_action_ != nullptr); - if (auto const& hosts = get_hosts(); - std::any_of(hosts.begin(), hosts.end(), [](const s4u::Host* host) { return not host->is_on(); })) { - /* If one of the hosts running the synchro failed, notice it. This way, the asking - * process can be killed if it runs on that host itself */ - set_state(State::FAILED); - } else if (model_action_->get_state() == resource::Action::State::FAILED) { - /* If all the hosts are running the synchro didn't fail, then the synchro was canceled */ - set_state(State::CANCELED); - } else { - set_state(State::DONE); - } - - clean_action(); - if (get_actor() != nullptr) { - get_actor()->activities_.erase(this); - } - if (get_state() != State::FAILED && cb_id_ >= 0) - s4u::Host::on_state_change.disconnect(cb_id_); - /* Answer all simcalls associated with the synchro */ - finish(); -} - void ExecImpl::set_exception(actor::ActorImpl* issuer) { switch (get_state()) { @@ -185,6 +161,25 @@ void ExecImpl::set_exception(actor::ActorImpl* issuer) void ExecImpl::finish() { XBT_DEBUG("ExecImpl::finish() in state %s", get_state_str()); + if (model_action_ != nullptr) { + if (auto const& hosts = get_hosts(); + std::any_of(hosts.begin(), hosts.end(), [](const s4u::Host* host) { return not host->is_on(); })) { + /* If one of the hosts running the synchro failed, notice it. This way, the asking + * process can be killed if it runs on that host itself */ + set_state(State::FAILED); + } else if (model_action_->get_state() == resource::Action::State::FAILED) { + /* If all the hosts are running the synchro didn't fail, then the synchro was canceled */ + set_state(State::CANCELED); + } else { + set_state(State::DONE); + } + + clean_action(); + } + + if (get_actor() != nullptr) + get_actor()->activities_.erase(this); + while (not simcalls_.empty()) { actor::Simcall* simcall = simcalls_.front(); simcalls_.pop_front(); @@ -208,8 +203,6 @@ void ExecImpl::finish() void ExecImpl::reset() { clear_hosts(); - bytes_amounts_.clear(); - flops_amounts_.clear(); set_start_time(-1.0); }