Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 09:42:57

0001 //
0002 // detail/impl/io_uring_service.hpp
0003 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0004 //
0005 // Copyright (c) 2003-2025 Christopher M. Kohlhoff (chris at kohlhoff dot com)
0006 //
0007 // Distributed under the Boost Software License, Version 1.0. (See accompanying
0008 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
0009 //
0010 
0011 #ifndef BOOST_ASIO_DETAIL_IMPL_IO_URING_SERVICE_HPP
0012 #define BOOST_ASIO_DETAIL_IMPL_IO_URING_SERVICE_HPP
0013 
0014 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
0015 # pragma once
0016 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
0017 
0018 #if defined(BOOST_ASIO_HAS_IO_URING)
0019 
0020 #include <boost/asio/detail/scheduler.hpp>
0021 
0022 #include <boost/asio/detail/push_options.hpp>
0023 
0024 namespace boost {
0025 namespace asio {
0026 namespace detail {
0027 
0028 inline void io_uring_service::post_immediate_completion(
0029     operation* op, bool is_continuation)
0030 {
0031   scheduler_.post_immediate_completion(op, is_continuation);
0032 }
0033 
0034 template <typename Time_Traits>
0035 void io_uring_service::add_timer_queue(timer_queue<Time_Traits>& queue)
0036 {
0037   do_add_timer_queue(queue);
0038 }
0039 
0040 template <typename Time_Traits>
0041 void io_uring_service::remove_timer_queue(timer_queue<Time_Traits>& queue)
0042 {
0043   do_remove_timer_queue(queue);
0044 }
0045 
0046 template <typename Time_Traits>
0047 void io_uring_service::schedule_timer(timer_queue<Time_Traits>& queue,
0048     const typename Time_Traits::time_type& time,
0049     typename timer_queue<Time_Traits>::per_timer_data& timer, wait_op* op)
0050 {
0051   mutex::scoped_lock lock(mutex_);
0052 
0053   if (shutdown_)
0054   {
0055     scheduler_.post_immediate_completion(op, false);
0056     return;
0057   }
0058 
0059   bool earliest = queue.enqueue_timer(time, timer, op);
0060   scheduler_.work_started();
0061   if (earliest)
0062   {
0063     update_timeout();
0064     post_submit_sqes_op(lock);
0065   }
0066 }
0067 
0068 template <typename Time_Traits>
0069 std::size_t io_uring_service::cancel_timer(timer_queue<Time_Traits>& queue,
0070     typename timer_queue<Time_Traits>::per_timer_data& timer,
0071     std::size_t max_cancelled)
0072 {
0073   mutex::scoped_lock lock(mutex_);
0074   op_queue<operation> ops;
0075   std::size_t n = queue.cancel_timer(timer, ops, max_cancelled);
0076   lock.unlock();
0077   scheduler_.post_deferred_completions(ops);
0078   return n;
0079 }
0080 
0081 template <typename Time_Traits>
0082 void io_uring_service::cancel_timer_by_key(timer_queue<Time_Traits>& queue,
0083     typename timer_queue<Time_Traits>::per_timer_data* timer,
0084     void* cancellation_key)
0085 {
0086   mutex::scoped_lock lock(mutex_);
0087   op_queue<operation> ops;
0088   queue.cancel_timer_by_key(timer, ops, cancellation_key);
0089   lock.unlock();
0090   scheduler_.post_deferred_completions(ops);
0091 }
0092 
0093 template <typename Time_Traits>
0094 void io_uring_service::move_timer(timer_queue<Time_Traits>& queue,
0095     typename timer_queue<Time_Traits>::per_timer_data& target,
0096     typename timer_queue<Time_Traits>::per_timer_data& source)
0097 {
0098   mutex::scoped_lock lock(mutex_);
0099   op_queue<operation> ops;
0100   queue.cancel_timer(target, ops);
0101   queue.move_timer(target, source);
0102   lock.unlock();
0103   scheduler_.post_deferred_completions(ops);
0104 }
0105 
0106 } // namespace detail
0107 } // namespace asio
0108 } // namespace boost
0109 
0110 #include <boost/asio/detail/pop_options.hpp>
0111 
0112 #endif // defined(BOOST_ASIO_HAS_IO_URING)
0113 
0114 #endif // BOOST_ASIO_DETAIL_IMPL_IO_URING_SERVICE_HPP