+
+void IoImpl::finish()
+{
+ for (smx_simcall_t const& simcall : simcalls_) {
+ switch (state_) {
+ case SIMIX_DONE:
+ /* do nothing, synchro done */
+ break;
+ case SIMIX_FAILED:
+ simcall->issuer->exception_ =
+ std::make_exception_ptr(simgrid::StorageFailureException(XBT_THROW_POINT, "Storage failed"));
+ break;
+ case SIMIX_CANCELED:
+ simcall->issuer->exception_ =
+ std::make_exception_ptr(simgrid::CancelException(XBT_THROW_POINT, "I/O Canceled"));
+ break;
+ default:
+ xbt_die("Internal error in IoImpl::finish(): unexpected synchro state %d", static_cast<int>(state_));
+ }
+
+ simcall->issuer->waiting_synchro = nullptr;
+ if (simcall->issuer->get_host()->is_on())
+ SIMIX_simcall_answer(simcall);
+ else
+ simcall->issuer->context_->iwannadie = true;
+ }
+}
+