X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3043ae53cf341baaa0dfaa6658be66f83c91a4c2..1aab041889e9a68f49b95561ddb756cb1710157b:/src/s4u/s4u_Exec.cpp diff --git a/src/s4u/s4u_Exec.cpp b/src/s4u/s4u_Exec.cpp index 86926f85aa..0b017ded7b 100644 --- a/src/s4u/s4u_Exec.cpp +++ b/src/s4u/s4u_Exec.cpp @@ -42,7 +42,7 @@ Exec* Exec::wait_for(double timeout) int Exec::wait_any_for(std::vector* execs, double timeout) { - std::unique_ptr rexecs(new kernel::activity::ExecImpl*[execs->size()]); + auto rexecs = std::make_unique(execs->size()); std::transform(begin(*execs), end(*execs), rexecs.get(), [](const ExecPtr& exec) { return static_cast(exec->pimpl_.get()); }); @@ -180,6 +180,10 @@ Exec* Exec::start() .set_flops_amount(flops_amounts_.front()) .start(); }); + + if (suspended_) + pimpl_->suspend(); + state_ = State::STARTED; on_start(*Actor::self(), *this); return this; @@ -217,7 +221,7 @@ void sg_exec_set_bound(sg_exec_t exec, double bound) exec->set_bound(bound); } -const char* sg_exec_get_name(sg_exec_t exec) +const char* sg_exec_get_name(const_sg_exec_t exec) { return exec->get_cname(); } @@ -265,8 +269,9 @@ sg_error_t sg_exec_wait(sg_exec_t exec) { sg_error_t status = SG_OK; + simgrid::s4u::ExecPtr s4u_exec(exec, false); try { - exec->wait_for(-1); + s4u_exec->wait_for(-1); } catch (const simgrid::TimeoutException&) { status = SG_ERROR_TIMEOUT; } catch (const simgrid::CancelException&) { @@ -274,15 +279,16 @@ sg_error_t sg_exec_wait(sg_exec_t exec) } catch (const simgrid::HostFailureException&) { status = SG_ERROR_HOST; } - exec->unref(); return status; } sg_error_t sg_exec_wait_for(sg_exec_t exec, double timeout) { sg_error_t status = SG_OK; + + simgrid::s4u::ExecPtr s4u_exec(exec, false); try { - exec->wait_for(timeout); + s4u_exec->wait_for(timeout); } catch (const simgrid::TimeoutException&) { status = SG_ERROR_TIMEOUT; } catch (const simgrid::CancelException&) { @@ -290,7 +296,6 @@ sg_error_t sg_exec_wait_for(sg_exec_t exec, double timeout) } catch (const simgrid::HostFailureException&) { status = SG_ERROR_HOST; } - exec->unref(); return status; } @@ -302,15 +307,13 @@ int sg_exec_wait_any(sg_exec_t* execs, size_t count) int sg_exec_wait_any_for(sg_exec_t* execs, size_t count, double timeout) { std::vector s4u_execs; - for (unsigned int i = 0; i < count; i++) { - s4u_execs.emplace_back(execs[i]); - } - int pos = simgrid::s4u::Exec::wait_any_for(&s4u_execs, timeout); - if (pos != -1) - s4u_execs[pos]->unref(); - else - for (const auto& e : s4u_execs) - e->unref(); + for (unsigned int i = 0; i < count; i++) + s4u_execs.emplace_back(execs[i], false); + int pos = simgrid::s4u::Exec::wait_any_for(&s4u_execs, timeout); + for (unsigned i = 0; i < count; i++) { + if (pos != -1 && static_cast(pos) != i) + s4u_execs[i]->add_ref(); + } return pos; }