X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a9b7bc21f207a2c28fe6f782e8cf4e3817d66231..1aab041889e9a68f49b95561ddb756cb1710157b:/src/s4u/s4u_Exec.cpp diff --git a/src/s4u/s4u_Exec.cpp b/src/s4u/s4u_Exec.cpp index ba688e407c..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,6 +221,16 @@ void sg_exec_set_bound(sg_exec_t exec, double bound) exec->set_bound(bound); } +const char* sg_exec_get_name(const_sg_exec_t exec) +{ + return exec->get_cname(); +} + +void sg_exec_set_name(sg_exec_t exec, const char* name) +{ + exec->set_name(name); +} + void sg_exec_set_host(sg_exec_t exec, sg_host_t new_host) { exec->set_host(new_host); @@ -255,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&) { @@ -264,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&) { @@ -280,6 +296,24 @@ 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; } + +int sg_exec_wait_any(sg_exec_t* execs, size_t count) +{ + return sg_exec_wait_any_for(execs, count, -1); +} + +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], 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; +}