#include "simgrid/simix.hpp"
#include <simgrid/Exception.hpp>
#include <simgrid/exec.h>
+#include <simgrid/s4u/ActivitySet.hpp>
#include <simgrid/s4u/Exec.hpp>
#include <simgrid/s4u/Host.hpp>
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_exec, s4u_activity, "S4U asynchronous executions");
namespace simgrid::s4u {
-xbt::signal<void(Exec const&)> Exec::on_start;
Exec::Exec(kernel::activity::ExecImplPtr pimpl)
{
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<Exec*>(pimpl->get_iface()));
}
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<ExecPtr>& execs, double timeout)
+ssize_t Exec::deprecated_wait_any_for(const std::vector<ExecPtr>& execs, double timeout) // XBT_ATTRIB_DEPRECATED_v339
{
- std::vector<ActivityPtr> activities;
+ if (execs.empty())
+ return -1;
+ ActivitySet set;
for (const auto& exec : execs)
- activities.push_back(boost::dynamic_pointer_cast<Activity>(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
} // namespace simgrid::s4u
/* **************************** Public C interface *************************** */
+int sg_exec_isinstance(sg_activity_t acti)
+{
+ return dynamic_cast<simgrid::s4u::Exec*>(acti) != nullptr;
+}
+
void sg_exec_set_bound(sg_exec_t exec, double bound)
{
exec->set_bound(bound);
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<simgrid::s4u::ExecPtr> 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<size_t>(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<simgrid::s4u::ExecPtr> 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<size_t>(pos) != i)
s4u_execs[i]->add_ref();