in include/unifex/win32/low_latency_iocp_context.hpp [501:531]
static void on_complete(operation_base* op) noexcept {
type& self = *static_cast<type*>(op);
std::error_code ec;
std::size_t totalBytesTransferred = self.get_result(ec);
self.context.release_io_state(self.ioState);
// Treat partial failure as a success case.
// TODO: Should we be sending tuple of (bytesTransferred, ec) here
// instead?
if (!ec || totalBytesTransferred > 0) {
if constexpr (is_nothrow_callable_v<
decltype(set_value),
Receiver,
std::size_t>) {
unifex::set_value(std::move(self.receiver_), totalBytesTransferred);
} else {
UNIFEX_TRY {
unifex::set_value(std::move(self.receiver_), totalBytesTransferred);
} UNIFEX_CATCH (...) {
unifex::set_error(
std::move(self.receiver_), std::current_exception());
}
}
} else if (ec == std::errc::operation_canceled) {
unifex::set_done(std::move(self.receiver_));
} else {
unifex::set_error(std::move(self.receiver_), std::move(ec));
}
}