9#if defined( RESTINIO_FREEBSD_TARGET ) || defined( RESTINIO_MACOS_TARGET )
12 #include <sys/sendfile.h>
26template <
typename Socket >
27class 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() };
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(
109 asio_ns::const_buffer{
111 static_cast< std::size_t
>(
n ) },
112 asio_ns::bind_executor(
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;
194#if defined( RESTINIO_FREEBSD_TARGET )
210 static_cast< size_t >(
236#elif defined( RESTINIO_MACOS_TARGET )
246 static_cast< off_t >(
295 asio_ns::ip::tcp::socket::wait_write,
296 asio_ns::bind_executor(
300 (
const asio_ns::error_code &
ec )
noexcept {
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();
370 if( !try_initiate_waiting_for_write_readiness() )
377 errno, asio_ns::error::get_system_category() },
387 (
void)try_initiate_waiting_for_write_readiness();
A base runner of sendfile operation (keeps all the data).
after_sendfile_cb_t m_after_sendfile_cb
const file_size_t m_chunk_size
file_size_t m_remained_size
file_offset_t m_next_write_offset
file_descriptor_t m_file_descriptor
default_asio_executor m_executor
file_size_t m_transfered_size
sendfile_operation_runner_t(const sendfile_operation_runner_t &)=delete
bool try_turn_non_blocking_mode() noexcept
bool try_initiate_waiting_for_write_readiness() noexcept
void init_next_write() noexcept
virtual void start() override
sendfile_operation_runner_t(sendfile_operation_runner_t &&)=delete
auto call_native_sendfile() noexcept
A runner of sendfile operation.
std::unique_ptr< char[] > m_buffer
auto make_async_write_handler() noexcept
Helper method for making a lambda for async_write completion handler.
virtual void start() override
sendfile_operation_runner_t(const sendfile_operation_runner_t &)=delete
sendfile_operation_runner_t & operator=(const sendfile_operation_runner_t &)=delete
void init_next_write() noexcept
sendfile_operation_runner_t(sendfile_operation_runner_t &&)=delete
sendfile_t sendfile(file_descriptor_holder_t fd, file_meta_t meta, file_size_t chunk_size=sendfile_default_chunk_size) noexcept
run_on_this_thread_settings_t< Traits > on_this_thread()
A special marker for the case when http_server must be run on the context of the current thread.
@ async_write_call_failed
A call to async_write failed. The corresponding write operation wasn't done.
asio_ns::error_code make_asio_compaible_error(asio_convertible_error_t err) noexcept
Make restinio error_code compatible with asio_ns::error_code.
std::uint64_t file_size_t