X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8c6bbb14f44b8daed5ea43d80880c6bf2155118b..a7cc502f224afb96f0203b94759cd0dabebf8de5:/src/s4u/s4u_Exec.cpp diff --git a/src/s4u/s4u_Exec.cpp b/src/s4u/s4u_Exec.cpp index 9ea3b10720..caa7466e2c 100644 --- a/src/s4u/s4u_Exec.cpp +++ b/src/s4u/s4u_Exec.cpp @@ -6,6 +6,7 @@ #include "simgrid/simix.hpp" #include #include +#include #include #include @@ -16,7 +17,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_exec, s4u_activity, "S4U asynchronous executions"); namespace simgrid::s4u { -xbt::signal Exec::on_start; Exec::Exec(kernel::activity::ExecImplPtr pimpl) { @@ -31,14 +31,6 @@ void Exec::reset() const ExecPtr Exec::init() { auto pimpl = kernel::activity::ExecImplPtr(new kernel::activity::ExecImpl()); - unsigned int cb_id = Host::on_state_change.connect([pimpl](s4u::Host const& h) { - if (not h.is_on() && pimpl->get_state() == kernel::activity::State::RUNNING && - std::find(pimpl->get_hosts().begin(), pimpl->get_hosts().end(), &h) != pimpl->get_hosts().end()) { - pimpl->set_state(kernel::activity::State::FAILED); - pimpl->post(); - } - }); - pimpl->set_cb_id(cb_id); return ExecPtr(static_cast(pimpl->get_iface())); } @@ -55,16 +47,28 @@ Exec* Exec::do_start() pimpl_->suspend(); state_ = State::STARTED; - on_start(*this); + fire_on_start(); + fire_on_this_start(); return this; } -ssize_t Exec::wait_any_for(const std::vector& execs, double timeout) +ssize_t Exec::deprecated_wait_any_for(const std::vector& execs, double timeout) // XBT_ATTRIB_DEPRECATED_v339 { - std::vector activities; + if (execs.empty()) + return -1; + ActivitySet set; for (const auto& exec : execs) - activities.push_back(boost::dynamic_pointer_cast(exec)); - return Activity::wait_any_for(activities, timeout); + set.push(exec); + try { + auto* ret = set.wait_any_for(timeout).get(); + for (size_t i = 0; i < execs.size(); i++) + if (execs[i].get() == ret) + return i; + + } catch (TimeoutException& e) { + return -1; + } + return -1; } /** @brief change the execution bound @@ -255,6 +259,11 @@ bool Exec::is_assigned() const } // namespace simgrid::s4u /* **************************** Public C interface *************************** */ +int sg_exec_isinstance(sg_activity_t acti) +{ + return dynamic_cast(acti) != nullptr; +} + void sg_exec_set_bound(sg_exec_t exec, double bound) { exec->set_bound(bound); @@ -327,18 +336,27 @@ sg_error_t sg_exec_wait_for(sg_exec_t exec, double timeout) return status; } -ssize_t sg_exec_wait_any(sg_exec_t* execs, size_t count) +ssize_t sg_exec_wait_any(sg_exec_t* execs, size_t count) // XBT_ATTRIB_DEPRECATED_v339 { - return sg_exec_wait_any_for(execs, count, -1.0); + std::vector s4u_execs; + for (size_t i = 0; i < count; i++) + s4u_execs.emplace_back(execs[i], false); + + ssize_t pos = simgrid::s4u::Exec::deprecated_wait_any_for(s4u_execs, -1.0); + for (size_t i = 0; i < count; i++) { + if (pos != -1 && static_cast(pos) != i) + s4u_execs[i]->add_ref(); + } + return pos; } -ssize_t sg_exec_wait_any_for(sg_exec_t* execs, size_t count, double timeout) +ssize_t sg_exec_wait_any_for(sg_exec_t* execs, size_t count, double timeout) // XBT_ATTRIB_DEPRECATED_v339 { std::vector s4u_execs; for (size_t i = 0; i < count; i++) s4u_execs.emplace_back(execs[i], false); - ssize_t pos = simgrid::s4u::Exec::wait_any_for(s4u_execs, timeout); + ssize_t pos = simgrid::s4u::Exec::deprecated_wait_any_for(s4u_execs, timeout); for (size_t i = 0; i < count; i++) { if (pos != -1 && static_cast(pos) != i) s4u_execs[i]->add_ref();