Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix simcall_blocking returning a value.
[simgrid.git] / src / s4u / s4u_Io.cpp
index c88ccc7..aec4f16 100644 (file)
@@ -7,6 +7,7 @@
 #include "simgrid/s4u/Disk.hpp"
 #include "simgrid/s4u/Io.hpp"
 #include "src/kernel/activity/IoImpl.hpp"
+#include "src/kernel/actor/ActorImpl.hpp"
 #include "xbt/log.h"
 
 namespace simgrid {
@@ -47,6 +48,7 @@ Io* Io::cancel()
 {
   simgrid::kernel::actor::simcall([this] { boost::static_pointer_cast<kernel::activity::IoImpl>(pimpl_)->cancel(); });
   state_ = State::CANCELED;
+  on_completion(*this);
   return this;
 }
 
@@ -60,8 +62,8 @@ Io* Io::wait_for(double timeout)
   if (state_ == State::INITED)
     vetoable_start();
 
-  kernel::actor::ActorImpl* issuer = Actor::self()->get_impl();
-  kernel::actor::simcall_blocking<void>([this, issuer, timeout] { this->get_impl()->wait_for(issuer, timeout); });
+  kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
+  kernel::actor::simcall_blocking([this, issuer, timeout] { this->get_impl()->wait_for(issuer, timeout); });
   state_ = State::FINISHED;
   this->release_dependencies();
 
@@ -72,7 +74,12 @@ Io* Io::wait_for(double timeout)
 IoPtr Io::set_disk(sg_disk_t disk)
 {
   disk_ = disk;
-  return this;
+
+  // Setting the disk may allow to start the activity, let's try
+  if (state_ == State::STARTING)
+    vetoable_start();
+
+ return this;
 }
 
 IoPtr Io::set_size(sg_size_t size)