Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
allow to call s4u::Exec->setHost() after its start, to migrate it
[simgrid.git] / src / s4u / s4u_exec.cpp
index 222ca13..6527dec 100644 (file)
@@ -13,20 +13,24 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_exec, s4u_activity, "S4U asynchronous execut
 namespace simgrid {
 namespace s4u {
 
-void Exec::start()
+Activity* Exec::start()
 {
   pimpl_ = simcall_execution_start(nullptr, flops_amount_, 1 / priority_, 0., host_);
   state_ = started;
+  return this;
 }
 
-void Exec::wait()
+Activity* Exec::wait()
 {
   simcall_execution_wait(pimpl_);
+  state_ = finished;
+  return this;
 }
 
-void Exec::wait(double timeout)
+Activity* Exec::wait(double timeout)
 {
   THROW_UNIMPLEMENTED;
+  return this;
 }
 
 bool Exec::test()
@@ -41,16 +45,25 @@ bool Exec::test()
     this->start();
   }
 
+  if (simcall_execution_test(pimpl_)) {
+    state_ = finished;
+    return true;
+  }
+
   return false;
 }
 
 ExecPtr Exec::setPriority(double priority)
 {
+  xbt_assert(state_ == inited, "Cannot change the priority of an exec after its start");
   priority_ = priority;
   return this;
 }
 ExecPtr Exec::setHost(Host* host)
 {
+  xbt_assert(state_ == inited || state_ == started, "Cannot change the host of an exec once it's done (state: %d)", state_);
+  if (state_ == started)
+    boost::static_pointer_cast<simgrid::kernel::activity::ExecImpl>(pimpl_)->migrate(host);
   host_ = host;
   return this;
 }