+Activity* Activity::wait_for(double timeout)
+{
+ if (state_ == State::INITED)
+ vetoable_start();
+
+ if (state_ == State::FAILED) {
+ if (dynamic_cast<Exec*>(this))
+ throw HostFailureException(XBT_THROW_POINT, "Cannot wait for a failed exec");
+ if (dynamic_cast<Io*>(this))
+ throw StorageFailureException(XBT_THROW_POINT, "Cannot wait for a failed I/O");
+ }
+
+ kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
+ kernel::actor::ActivityWaitSimcall observer{issuer, pimpl_.get(), timeout};
+ if (kernel::actor::simcall_blocking(
+ [&observer] { observer.get_activity()->wait_for(observer.get_issuer(), observer.get_timeout()); }, &observer))
+ throw TimeoutException(XBT_THROW_POINT, "Timeouted");
+ complete(State::FINISHED);
+ return this;
+}
+