9 #if defined( RESTINIO_FREEBSD_TARGET ) || defined( RESTINIO_MACOS_TARGET )
12 #include <sys/sendfile.h>
26 template <
typename Socket >
27 class sendfile_operation_runner_t final
28 :
public sendfile_operation_runner_base_t< Socket >
39 using base_type_t::base_type_t;
44 #if defined( RESTINIO_FREEBSD_TARGET ) || defined( RESTINIO_MACOS_TARGET )
50 if(
static_cast< off_t
>( -1 ) != n )
56 const asio_ns::error_code ec{ errno, asio_ns::error::get_system_category() };
77 auto const n = ::read(
80 std::min< file_size_t >(
81 this->m_remained_size, this->m_chunk_size ) );
91 asio_ns::error::get_system_category() },
99 asio_ns::error::get_system_category() },
107 asio_ns::async_write(
111 static_cast< std::size_t
>( n ) },
112 asio_ns::bind_executor(
120 asio_convertible_error_t::async_write_call_failed ),
136 return [
this, ctx = this->shared_from_this()]
138 (
const asio_ns::error_code & ec, std::size_t written ) noexcept
179 if( !
m_socket.native_non_blocking() )
181 asio_ns::error_code ec;
182 m_socket.native_non_blocking(
true, ec );
194 #if defined( RESTINIO_FREEBSD_TARGET )
197 call_native_sendfile() noexcept
210 static_cast< size_t >(
215 #
if __FreeBSD__ >= 11
216 SF_FLAGS( 16, SF_NOCACHE )
236 #elif defined( RESTINIO_MACOS_TARGET )
239 call_native_sendfile() noexcept
246 static_cast< off_t
>(
295 asio_ns::ip::tcp::socket::wait_write,
296 asio_ns::bind_executor(
298 [
this, ctx = this->shared_from_this() ]
300 (
const asio_ns::error_code & ec ) noexcept {
315 asio_convertible_error_t::async_write_call_failed ),
332 using base_type_t::base_type_t;
347 if( !try_turn_non_blocking_mode() )
360 (void)try_initiate_waiting_for_write_readiness();
364 const auto n = call_native_sendfile();
368 if( errno == EAGAIN || errno == EINTR )
370 if( !try_initiate_waiting_for_write_readiness() )
377 errno, asio_ns::error::get_system_category() },
387 (void)try_initiate_waiting_for_write_readiness();