13#include <boost/capy/buffers.hpp>
14#include <boost/capy/concept/io_awaitable.hpp>
15#include <boost/capy/continuation.hpp>
16#include <boost/capy/ex/io_env.hpp>
17#include <boost/capy/io_result.hpp>
30 using buf_iter_t =
decltype(boost::capy::begin(std::declval<BuffersTy const &>()));
31 using buffer_t = boost::capy::buffer_type<BuffersTy>;
38 boost::capy::continuation
cont;
48 self_t &self = *
static_cast<self_t *
>(tfer->user_data);
49 const auto resume_on_zero = [&] ()
51 if (self.await_state->in_flight == 0)
56 self.await_state->in_flight--;
59 std::unique_lock lock{self.await_state->mutex};
60 ok = (bool)self.await_state->ec;
67 if (tfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS)
69 for (
int i = 0; i < tfer->num_iso_packets; i++)
71 self.await_state->total += tfer->iso_packet_desc[i].actual_length;
72 if (tfer->status != LIBUSB_TRANSFER_COMPLETED) [[unlikely]]
75 std::unique_lock lock{self.await_state->mutex};
77 static_cast<status>(tfer->iso_packet_desc[i].status));
86 self.await_state->total += tfer->actual_length;
88 if (tfer->status != LIBUSB_TRANSFER_COMPLETED) [[unlikely]]
91 std::unique_lock lock{self.await_state->mutex};
97 if (self.buf_current == self.buf_end) [[unlikely]]
104 tfer->buffer = (
unsigned char *)buf.data();
105 tfer->length = buf.size();
106 int r = libusb_submit_transfer(tfer);
107 if (r != LIBUSB_SUCCESS) [[unlikely]]
110 std::unique_lock lock{self.await_state->mutex};
116 self.await_state->in_flight++;
124 assert((submission_size <= seq_view->size()) &&
125 "submission size must not be greater than number of transfers");
127 "submission size must not be greater than number of buffers");
136 boost::capy::io_env
const *io_env)
138 if (io_env->stop_token.stop_requested())
152 tfer->buffer = (
unsigned char *)buf.data();
153 tfer->length = buf.size();
154 tfer->user_data =
this;
161 int r = libusb_submit_transfer(tfer);
162 if (r != LIBUSB_SUCCESS) [[unlikely]]
170 return std::noop_coroutine();
188 boost::capy::IoAwaitable<sequence_awaitable<libusb_transfer *, boost::capy::mutable_buffer>>,
189 "Not a proper IoAwaitable");
190static_assert(boost::capy::IoAwaitable<
191 sequence_awaitable<std::vector<libusb_transfer *>, boost::capy::const_buffer>>,
192 "Not a proper IoAwaitable");
Unified concept for buffer sequences.
constexpr auto transfer_of(Ty const &tfer_res) -> libusb_transfer *
Uniform accessor for obtaining a libusb_transfer * from a co_usb::transfer::detail::TransferResource.
Definition transfer_sequence.hpp:41
status
Status codes for transfers.
Definition status.hpp:22
Definition complete_io.hpp:21
std::error_code make_transfer_status(status e) noexcept
Definition status.hpp:74
usb_error
USB error enumeration.
Definition usb_error.hpp:20
std::error_code make_usb_error_code(usb_error e) noexcept
Definition usb_error.hpp:85
View of a certain transfer sequence. Provides a uniform range interface.
Status codes for transfers.
Definition sequence_awaitable.hpp:34
std::error_code ec
Definition sequence_awaitable.hpp:40
std::mutex mutex
Definition sequence_awaitable.hpp:35
boost::capy::io_env const * io_env
Definition sequence_awaitable.hpp:37
boost::capy::continuation cont
Definition sequence_awaitable.hpp:38
size_t in_flight
Definition sequence_awaitable.hpp:42
size_t total
Definition sequence_awaitable.hpp:41
Definition sequence_awaitable.hpp:28
buf_iter_t buf_current
Definition sequence_awaitable.hpp:181
buf_iter_t buf_end
Definition sequence_awaitable.hpp:182
bool await_ready()
Definition sequence_awaitable.hpp:130
sequence_awaitable(await_state_t *await_state, sequence_view< TSeq > *seq_view, BuffersTy const &buffers, size_t submission_size)
Definition sequence_awaitable.hpp:119
await_state_t * await_state
Definition sequence_awaitable.hpp:178
std::coroutine_handle await_suspend(std::coroutine_handle<> h, boost::capy::io_env const *io_env)
Definition sequence_awaitable.hpp:135
size_t submission_size
Definition sequence_awaitable.hpp:184
static void transfer_callback(libusb_transfer *tfer) noexcept
Definition sequence_awaitable.hpp:45
boost::capy::io_result< size_t > await_resume()
Definition sequence_awaitable.hpp:173
decltype(boost::capy::begin(std::declval< BuffersTy const & >())) buf_iter_t
Definition sequence_awaitable.hpp:30
boost::capy::buffer_type< BuffersTy > buffer_t
Definition sequence_awaitable.hpp:31
sequence_view< TSeq > * view
Definition sequence_awaitable.hpp:179
sequence_view< TSeq >::iterator_type tfer_iter_t
Definition sequence_awaitable.hpp:29
View of a certain transfer sequence. Provides a uniform range interface.
Definition sequence_view.hpp:28
decltype(detail::transfer_begin(std::declval< Seq const & >())) iterator_type
Definition sequence_view.hpp:29
auto begin() const noexcept
Definition sequence_view.hpp:48
auto end() const noexcept
Definition sequence_view.hpp:53
Transfer resource and transfer sequence concepts.