Skip to content

Commit 2aac165

Browse files
committed
Merge asio 1.31.0 from 'develop'.
2 parents 6940e16 + 44238d0 commit 2aac165

51 files changed

Lines changed: 4664 additions & 1485 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

doc/history.qbk

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,174 @@
77

88
[section:history Revision History]
99

10+
[heading Asio 1.31.0 / Boost 1.86 beta]
11+
12+
* Changed the `default_completion_token` trait's primary template to select
13+
`deferred` as the default completion token. As a result, most asynchronous
14+
operations' initiating functions will return a deferred asynchronous operation
15+
by default. For example, the completion token can be omitted when calling
16+
asynchronous operations from an `awaitable` coroutine:[br]
17+
``
18+
awaitable<void> echo(ip::tcp::socket& my_socket)
19+
{
20+
char data[1024];
21+
for (;;)
22+
{
23+
std::size_t n = co_await my_socket.async_read_some(buffer(data));
24+
co_await async_write(my_socket, buffer(data, n));
25+
}
26+
}
27+
``
28+
or when using an operation that accepts asynchronous operations as function
29+
objects, such as `experimental::make_parallel_group`:[br]
30+
``
31+
experimental::make_parallel_group(
32+
my_socket.async_read_some(buffer(data)),
33+
my_timer.async_wait()
34+
).async_wait(/* ... */);
35+
``
36+
* Added the `is_completion_condition` trait and used it to add the missing
37+
default completion tokens to overloads of `async_read`, `async_read_at`,
38+
`async_write`, and `async_write_at`.
39+
* Added the `is_connect_condition` trait and used it disambiguate overloads of
40+
`async_connect` when the completion token is defaulted.
41+
* Extended the completion token adapters `as_tuple`, `bind_allocator`,
42+
`bind_cancellation_slot`, `bind_executor`, `bind_immediate_executor`, and
43+
`redirect_error` to allow them to be used as ['partial completion token
44+
adapters]. This means that they can be created without explicitly supplying a
45+
completion token. Instead, when the adapter is passed to an asynchronous
46+
operation, it will automatically determine the operation's default completion
47+
token and adapt it. For example, the expression:[br]
48+
``
49+
my_socket.async_read_some(my_buffer, as_tuple)
50+
``
51+
will return a deferred asynchronous operation with the completion arguments
52+
packaged in a tuple. They may also be applied using the `deferred` operations'
53+
pipe operator:[br]
54+
``
55+
error_code e;
56+
co_await (async_write(my_socket, my_buffer) | redirect_error(e));
57+
``
58+
* Added the `cancel_after` and `cancel_at` completion token adapters. These
59+
may be used to adapt any asynchronous operation to emit a cancellation signal
60+
after a specified duration or at an absolute time point. For example:[br]
61+
``
62+
my_socket.async_read_some(my_buffer,
63+
cancel_after(std::chrono::seconds(10),
64+
[](error_code e, std::size_t n)
65+
{
66+
// ...
67+
}));
68+
``
69+
This cancellation is implemented internally using a `basic_waitable_timer`.
70+
By default, this timer is created using the asynchronous operation's I/O
71+
executor. If the operation does specify its I/O executor, a timer may be
72+
explicitly supplied:[br]
73+
``
74+
my_socket.async_read_some(my_buffer,
75+
cancel_after(my_timer, std::chrono::seconds(10),
76+
[](error_code e, std::size_t n)
77+
{
78+
// ...
79+
}));
80+
``
81+
These adapters may also be used as partial completion token adapters, as
82+
in:[br]
83+
``
84+
co_await my_socket.async_read_some(my_buffer, cancel_after(5s));
85+
``
86+
or:[br]
87+
``
88+
co_await (
89+
async_write(my_socket, my_buffer) | as_tuple
90+
| cancel_after(std::chronos::seconds(10)
91+
);
92+
``
93+
or to adapt other partial completion token adapters:[br]
94+
``
95+
co_await my_socket.async_read_some(my_buffer, cancel_after(5s, as_tuple));
96+
``
97+
Note that, since the implementation in terms of a timer introduces a parallel
98+
`async_wait` operation, it is the responsibility of the caller to ensure that
99+
the asynchronous operation is performed in an implicit or explicit strand.
100+
* Changed all completion token adapters to ensure they correctly propagate the
101+
asynchronous operation's I/O executor during adaptation.
102+
* Fixed `async_compose` and `co_composed` to correctly indicate if they have
103+
an I/O executor.
104+
* Moved `co_composed` out of the `experimental` namespace.
105+
* Added `composed`, which creates an initiation function object from a stateful
106+
implementation. It is similar to `co_composed`, but for regular function
107+
objects rather than C++20 coroutines. For example:
108+
``
109+
struct async_echo_implementation
110+
{
111+
tcp::socket& socket_;
112+
mutable_buffer buffer_;
113+
enum { starting, reading, writing } state_;
114+
115+
template <typename Self>
116+
void operator()(Self& self,
117+
error_code error,
118+
std::size_t n)
119+
{
120+
switch (state_)
121+
{
122+
// ...
123+
}
124+
}
125+
};
126+
127+
template <typename CompletionToken>
128+
auto async_echo(tcp::socket& socket,
129+
mutable_buffer buffer,
130+
CompletionToken&& token)
131+
{
132+
return async_initiate<CompletionToken,
133+
void(error_code, std::size_t)>(
134+
composed(
135+
async_echo_implementation{socket, buffer,
136+
async_echo_implementation::starting}, socket),
137+
token, error_code{}, 0);
138+
}
139+
``
140+
The `async_compose` function has been changed to be a thin wrapper around
141+
`composed`. However, unlike `async_compose`, `composed` allows arguments to be
142+
passed to the stateful implementation when the operation is initiated.
143+
* Changed the `detached` completion token to work with asynchronous operations
144+
that have multiple completion signatures.
145+
* Changed `async_initiate` to allow an empty variadic list of completion
146+
signatures, which would indicate that an asynchronous operation never
147+
completes.
148+
* Added overloads of `async_initiate` that automatically deduce the type of
149+
the completion token. For example:[br]
150+
``
151+
async_initiate(co_composed(/* ... */), detached, arg_1, arg_2);
152+
``
153+
will deduce the token type from the argument `detached`.
154+
* Added `async_immediate` which implements a trivial asynchronous operation that
155+
completes immediately, using an associated immediate executor if available.
156+
It is intended for use within asynchronous compositions to make it easier to
157+
provide optimised immediate completion.
158+
* Updated the documentation for various asynchronous operations to specify
159+
immediate completion in terms of `async_immediate`.
160+
* Enabled SFINAE-based partial specialisation of the `associator` trait.
161+
* Changed to use the recycling allocator as the fallback for all operations,
162+
rather than calling the underlying recycling allocation helper functions
163+
directly.
164+
* Fixed the `deferred` implementation to ensure that the wrapped initiation
165+
function object's copyability is correctly propagated.
166+
* Fixed `experimental::coro` compatibility with clang 15.
167+
* Fixed deduction of a completion handler's default immediate executor type.
168+
* Don't use `ioctl` to modify the non-blocking mode on socket or descriptors
169+
that have been assigned, as they may originate from an external source.
170+
* Don't call `fcntl` with `F_SETFL` if the flags aren't changing.
171+
* Don't enable non-blocking mode when performing an `async_wait` operation on
172+
sockets or descriptors.
173+
* Update some composed operation examples to destroy the timer object before
174+
calling the completion handler.
175+
* Fix `read_until` regex support when `BOOST_ASIO_NO_DYNAMIC_BUFFER_V1` is
176+
defined.
177+
10178
[heading Asio 1.30.2 / Boost 1.85]
11179

12180
* Fixed `co_spawn` to correctly propagate exceptions resulting from cancellation

doc/quickref.xml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@
163163
<member><link linkend="boost_asio.reference.io_context__strand">io_context::strand</link></member>
164164
<member><link linkend="boost_asio.reference.io_context__work">io_context::work</link> (deprecated)</member>
165165
<member><link linkend="boost_asio.reference.multiple_exceptions">multiple_exceptions</link></member>
166+
<member><link linkend="boost_asio.reference.partial_as_tuple">partial_as_tuple</link></member>
167+
<member><link linkend="boost_asio.reference.partial_redirect_error">partial_redirect_error</link></member>
166168
<member><link linkend="boost_asio.reference.service_already_exists">service_already_exists</link></member>
167169
<member><link linkend="boost_asio.reference.static_thread_pool">static_thread_pool</link></member>
168170
<member><link linkend="boost_asio.reference.system_context">system_context</link></member>
@@ -186,6 +188,8 @@
186188
<member><link linkend="boost_asio.reference.basic_io_object">basic_io_object</link></member>
187189
<member><link linkend="boost_asio.reference.basic_system_executor">basic_system_executor</link></member>
188190
<member><link linkend="boost_asio.reference.basic_yield_context">basic_yield_context</link></member>
191+
<member><link linkend="boost_asio.reference.cancel_after_t">cancel_after_t</link></member>
192+
<member><link linkend="boost_asio.reference.cancel_at_t">cancel_at_t</link></member>
189193
<member><link linkend="boost_asio.reference.cancellation_filter">cancellation_filter</link></member>
190194
<member><link linkend="boost_asio.reference.cancellation_slot_binder">cancellation_slot_binder</link></member>
191195
<member><link linkend="boost_asio.reference.consign_t">consign_t</link></member>
@@ -207,6 +211,14 @@
207211
<member><link linkend="boost_asio.reference.experimental__wait_for_one_error">experimental::wait_for_one_error</link></member>
208212
<member><link linkend="boost_asio.reference.experimental__wait_for_one_success">experimental::wait_for_one_success</link></member>
209213
<member><link linkend="boost_asio.reference.io_context__basic_executor_type">io_context::basic_executor_type</link></member>
214+
<member><link linkend="boost_asio.reference.partial_allocator_binder">partial_allocator_binder</link></member>
215+
<member><link linkend="boost_asio.reference.partial_cancel_after">partial_cancel_after</link></member>
216+
<member><link linkend="boost_asio.reference.partial_cancel_after_timer">partial_cancel_after_timer</link></member>
217+
<member><link linkend="boost_asio.reference.partial_cancel_at">partial_cancel_at</link></member>
218+
<member><link linkend="boost_asio.reference.partial_cancel_at_timer">partial_cancel_at_timer</link></member>
219+
<member><link linkend="boost_asio.reference.partial_cancellation_slot_binder">partial_cancellation_slot_binder</link></member>
220+
<member><link linkend="boost_asio.reference.partial_executor_binder">partial_executor_binder</link></member>
221+
<member><link linkend="boost_asio.reference.partial_immediate_executor_binder">partial_immediate_executor_binder</link></member>
210222
<member><link linkend="boost_asio.reference.prepend_t">prepend_t</link></member>
211223
<member><link linkend="boost_asio.reference.recycling_allocator">recycling_allocator</link></member>
212224
<member><link linkend="boost_asio.reference.redirect_error_t">redirect_error_t</link></member>
@@ -221,16 +233,19 @@
221233
<simplelist type="vert" columns="1">
222234
<member><link linkend="boost_asio.reference.execution_context.add_service">add_service</link> (deprecated)</member>
223235
<member><link linkend="boost_asio.reference.append">append</link></member>
224-
<member><link linkend="boost_asio.reference.as_tuple">as_tuple</link></member>
225236
<member><link linkend="boost_asio.reference.asio_handler_is_continuation">asio_handler_is_continuation</link></member>
226237
<member><link linkend="boost_asio.reference.async_compose">async_compose</link></member>
238+
<member><link linkend="boost_asio.reference.async_immediate">async_immediate</link></member>
227239
<member><link linkend="boost_asio.reference.async_initiate">async_initiate</link></member>
228240
<member><link linkend="boost_asio.reference.bind_allocator">bind_allocator</link></member>
229241
<member><link linkend="boost_asio.reference.bind_cancellation_slot">bind_cancellation_slot</link></member>
230242
<member><link linkend="boost_asio.reference.bind_executor">bind_executor</link></member>
231243
<member><link linkend="boost_asio.reference.bind_immediate_executor">bind_immediate_executor</link></member>
244+
<member><link linkend="boost_asio.reference.cancel_after">cancel_after</link></member>
245+
<member><link linkend="boost_asio.reference.cancel_at">cancel_at</link></member>
232246
<member><link linkend="boost_asio.reference.co_composed">co_composed</link></member>
233247
<member><link linkend="boost_asio.reference.co_spawn">co_spawn</link></member>
248+
<member><link linkend="boost_asio.reference.composed">composed</link></member>
234249
<member><link linkend="boost_asio.reference.consign">consign</link></member>
235250
<member><link linkend="boost_asio.reference.defer">defer</link></member>
236251
<member><link linkend="boost_asio.reference.dispatch">dispatch</link></member>
@@ -254,6 +269,7 @@
254269
</simplelist>
255270
<bridgehead renderas="sect3">Special Values</bridgehead>
256271
<simplelist type="vert" columns="1">
272+
<member><link linkend="boost_asio.reference.as_tuple">as_tuple</link></member>
257273
<member><link linkend="boost_asio.reference.deferred">deferred</link></member>
258274
<member><link linkend="boost_asio.reference.detached">detached</link></member>
259275
<member><link linkend="boost_asio.reference.executor_arg">executor_arg</link></member>

0 commit comments

Comments
 (0)