-/* Copyright (c) 2006-2020. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2006-2021. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
namespace simgrid {
namespace s4u {
-xbt::signal<void(Actor const&, Exec const&)> Exec::on_start;
-xbt::signal<void(Actor const&, Exec const&)> Exec::on_completion;
+xbt::signal<void(Exec const&)> Exec::on_start;
+xbt::signal<void(Exec const&)> Exec::on_completion;
Exec::Exec()
{
pimpl_ = kernel::activity::ExecImplPtr(new kernel::activity::ExecImpl());
}
+ExecPtr Exec::init()
+{
+ return ExecPtr(new Exec());
+}
+
Exec* Exec::wait()
{
return this->wait_for(-1);
kernel::actor::ActorImpl* issuer = Actor::self()->get_impl();
kernel::actor::simcall_blocking<void>([this, issuer, timeout] { this->get_impl()->wait_for(issuer, timeout); });
state_ = State::FINISHED;
- on_completion(*Actor::self(), *this);
+ on_completion(*this);
this->release_dependencies();
return this;
}
* The activity cannot be terminated already (but it may be started). */
ExecPtr Exec::set_host(Host* host)
{
- xbt_assert(state_ == State::INITED || state_ == State::STARTED,
+ xbt_assert(state_ == State::INITED || state_ == State::STARTING || state_ == State::STARTED,
"Cannot change the host of an exec once it's done (state: %d)", (int)state_);
+ hosts_.assign(1, host);
+
if (state_ == State::STARTED)
boost::static_pointer_cast<kernel::activity::ExecImpl>(pimpl_)->migrate(host);
+
boost::static_pointer_cast<kernel::activity::ExecImpl>(pimpl_)->set_host(host);
+
+ if (state_ == State::STARTING)
+ // Setting the host may allow to start the activity, let's try
+ vetoable_start();
+
return this;
}
ExecPtr Exec::set_hosts(const std::vector<Host*>& hosts)
{
- xbt_assert(state_ == State::INITED, "Cannot change the hosts of an exec once it's done (state: %d)", (int)state_);
+ xbt_assert(state_ == State::INITED || state_ == State::STARTING,
+ "Cannot change the hosts of an exec once it's done (state: %d)", (int)state_);
+
hosts_ = hosts;
parallel_ = true;
+
+ // Setting the host may allow to start the activity, let's try
+ if (state_ == State::STARTING)
+ vetoable_start();
+
return this;
}
pimpl_->suspend();
state_ = State::STARTED;
- on_start(*Actor::self(), *this);
+ on_start(*this);
return this;
}