Skip to content

Commit 59066d8

Browse files
committed
Add custom I/O executor support to I/O objects.
All I/O objects now have an additional Executor template parameter. This template parameter defaults to the asio::executor type (the polymorphic executor wrapper) but can be used to specify a user-defined executor type. I/O objects' constructors and functions that previously took an asio::io_context& now accept either an Executor or a reference to a concrete ExecutionContext (such as asio::io_context or asio::thread_pool). One potential point of breakage in existing user code is when reusing an I/O object's io_context for constructing another I/O object, as in: asio::steady_timer my_timer(my_socket.get_executor().context()); To fix this, either construct the second I/O object using the first I/O object's executor: asio::steady_timer my_timer(my_socket.get_executor()); or otherwise explicitly pass the io_context: asio::steady_timer my_timer(my_io_context);
1 parent a72fbb0 commit 59066d8

File tree

163 files changed

+8245
-5159
lines changed

Some content is hidden

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

163 files changed

+8245
-5159
lines changed

example/cpp03/http/server2/server.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ server::server(const std::string& address, const std::string& port,
3333
signals_.async_wait(boost::bind(&server::handle_stop, this));
3434

3535
// Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).
36-
boost::asio::ip::tcp::resolver resolver(acceptor_.get_executor().context());
36+
boost::asio::ip::tcp::resolver resolver(acceptor_.get_executor());
3737
boost::asio::ip::tcp::endpoint endpoint =
3838
*resolver.resolve(address, port).begin();
3939
acceptor_.open(endpoint.protocol());

example/cpp03/http/server3/connection.cpp

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ namespace server3 {
1919
connection::connection(boost::asio::io_context& io_context,
2020
request_handler& handler)
2121
: strand_(io_context),
22-
socket_(io_context),
22+
socket_(strand_),
2323
request_handler_(handler)
2424
{
2525
}
@@ -32,10 +32,9 @@ boost::asio::ip::tcp::socket& connection::socket()
3232
void connection::start()
3333
{
3434
socket_.async_read_some(boost::asio::buffer(buffer_),
35-
boost::asio::bind_executor(strand_,
36-
boost::bind(&connection::handle_read, shared_from_this(),
37-
boost::asio::placeholders::error,
38-
boost::asio::placeholders::bytes_transferred)));
35+
boost::bind(&connection::handle_read, shared_from_this(),
36+
boost::asio::placeholders::error,
37+
boost::asio::placeholders::bytes_transferred));
3938
}
4039

4140
void connection::handle_read(const boost::system::error_code& e,
@@ -51,25 +50,22 @@ void connection::handle_read(const boost::system::error_code& e,
5150
{
5251
request_handler_.handle_request(request_, reply_);
5352
boost::asio::async_write(socket_, reply_.to_buffers(),
54-
boost::asio::bind_executor(strand_,
55-
boost::bind(&connection::handle_write, shared_from_this(),
56-
boost::asio::placeholders::error)));
53+
boost::bind(&connection::handle_write, shared_from_this(),
54+
boost::asio::placeholders::error));
5755
}
5856
else if (!result)
5957
{
6058
reply_ = reply::stock_reply(reply::bad_request);
6159
boost::asio::async_write(socket_, reply_.to_buffers(),
62-
boost::asio::bind_executor(strand_,
63-
boost::bind(&connection::handle_write, shared_from_this(),
64-
boost::asio::placeholders::error)));
60+
boost::bind(&connection::handle_write, shared_from_this(),
61+
boost::asio::placeholders::error));
6562
}
6663
else
6764
{
6865
socket_.async_read_some(boost::asio::buffer(buffer_),
69-
boost::asio::bind_executor(strand_,
70-
boost::bind(&connection::handle_read, shared_from_this(),
71-
boost::asio::placeholders::error,
72-
boost::asio::placeholders::bytes_transferred)));
66+
boost::bind(&connection::handle_read, shared_from_this(),
67+
boost::asio::placeholders::error,
68+
boost::asio::placeholders::bytes_transferred));
7369
}
7470
}
7571

example/cpp03/http/server4/server.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ void server::operator()(boost::system::error_code ec, std::size_t length)
4545
do
4646
{
4747
// Create a new socket for the next incoming connection.
48-
socket_.reset(new tcp::socket(acceptor_->get_executor().context()));
48+
socket_.reset(new tcp::socket(acceptor_->get_executor()));
4949

5050
// Accept a new connection. The "yield" pseudo-keyword saves the current
5151
// line number and exits the coroutine's "reenter" block. We use the

example/cpp03/nonblocking/third_party_lib.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ class connection
8383
public:
8484
typedef boost::shared_ptr<connection> pointer;
8585

86-
static pointer create(boost::asio::io_context& io_context)
86+
static pointer create(const boost::asio::executor& ex)
8787
{
88-
return pointer(new connection(io_context));
88+
return pointer(new connection(ex));
8989
}
9090

9191
tcp::socket& socket()
@@ -102,8 +102,8 @@ class connection
102102
}
103103

104104
private:
105-
connection(boost::asio::io_context& io_context)
106-
: socket_(io_context),
105+
connection(const boost::asio::executor& ex)
106+
: socket_(ex),
107107
session_impl_(socket_),
108108
read_in_progress_(false),
109109
write_in_progress_(false)
@@ -193,7 +193,7 @@ class server
193193
void start_accept()
194194
{
195195
connection::pointer new_connection =
196-
connection::create(acceptor_.get_executor().context());
196+
connection::create(acceptor_.get_executor());
197197

198198
acceptor_.async_accept(new_connection->socket(),
199199
boost::bind(&server::handle_accept, this, new_connection,

example/cpp03/porthopper/server.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ class server
3636
next_frame_number_(1)
3737
{
3838
// Start waiting for a new control connection.
39-
tcp_socket_ptr new_socket(
40-
new tcp::socket(acceptor_.get_executor().context()));
39+
tcp_socket_ptr new_socket(new tcp::socket(acceptor_.get_executor()));
4140
acceptor_.async_accept(*new_socket,
4241
boost::bind(&server::handle_accept, this,
4342
boost::asio::placeholders::error, new_socket));
@@ -60,8 +59,7 @@ class server
6059
}
6160

6261
// Start waiting for a new control connection.
63-
tcp_socket_ptr new_socket(
64-
new tcp::socket(acceptor_.get_executor().context()));
62+
tcp_socket_ptr new_socket(new tcp::socket(acceptor_.get_executor()));
6563
acceptor_.async_accept(*new_socket,
6664
boost::bind(&server::handle_accept, this,
6765
boost::asio::placeholders::error, new_socket));
@@ -75,7 +73,7 @@ class server
7573
{
7674
// Delay handling of the control request to simulate network latency.
7775
timer_ptr delay_timer(
78-
new boost::asio::steady_timer(acceptor_.get_executor().context()));
76+
new boost::asio::steady_timer(acceptor_.get_executor()));
7977
delay_timer->expires_after(boost::asio::chrono::seconds(2));
8078
delay_timer->async_wait(
8179
boost::bind(&server::handle_control_request_timer, this,

example/cpp03/services/basic_logger.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ class basic_logger
3434
/**
3535
* This constructor creates a logger.
3636
*
37-
* @param io_context The io_context object used to locate the logger service.
37+
* @param context The execution context used to locate the logger service.
3838
*
3939
* @param identifier An identifier for this logger.
4040
*/
41-
explicit basic_logger(boost::asio::io_context& io_context,
41+
explicit basic_logger(boost::asio::execution_context& context,
4242
const std::string& identifier)
43-
: service_(boost::asio::use_service<Service>(io_context)),
43+
: service_(boost::asio::use_service<Service>(context)),
4444
impl_(service_.null())
4545
{
4646
service_.create(impl_, identifier);

example/cpp03/services/logger_service.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,3 @@
99
//
1010

1111
#include "logger_service.hpp"
12-
13-
namespace services {
14-
15-
boost::asio::io_context::id logger_service::id;
16-
17-
} // namespace services

example/cpp03/services/logger_service.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ namespace services {
2525

2626
/// Service implementation for the logger.
2727
class logger_service
28-
: public boost::asio::io_context::service
28+
: public boost::asio::execution_context::service
2929
{
3030
public:
31-
/// The unique service identifier.
32-
static boost::asio::io_context::id id;
31+
/// The type used to identify this service in the execution context.
32+
typedef logger_service key_type;
3333

3434
/// The backend implementation of a logger.
3535
struct logger_impl
@@ -42,8 +42,8 @@ class logger_service
4242
typedef logger_impl* impl_type;
4343

4444
/// Constructor creates a thread to run a private io_context.
45-
logger_service(boost::asio::io_context& io_context)
46-
: boost::asio::io_context::service(io_context),
45+
logger_service(boost::asio::execution_context& context)
46+
: boost::asio::execution_context::service(context),
4747
work_io_context_(),
4848
work_(boost::asio::make_work_guard(work_io_context_)),
4949
work_thread_(new boost::thread(
@@ -62,7 +62,7 @@ class logger_service
6262
}
6363

6464
/// Destroy all user-defined handler objects owned by the service.
65-
void shutdown_service()
65+
void shutdown()
6666
{
6767
}
6868

example/cpp03/timeouts/blocking_token_tcp_client.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,17 @@
2222

2323
using boost::asio::ip::tcp;
2424

25+
// We will use our sockets only with an io_context.
26+
typedef boost::asio::basic_stream_socket<tcp,
27+
boost::asio::io_context::executor_type> tcp_socket;
28+
2529
//----------------------------------------------------------------------
2630

2731
// A custom completion token that makes asynchronous operations behave as
2832
// though they are blocking calls with a timeout.
2933
struct close_after
3034
{
31-
close_after(boost::asio::chrono::steady_clock::duration t, tcp::socket& s)
35+
close_after(boost::asio::chrono::steady_clock::duration t, tcp_socket& s)
3236
: timeout_(t), socket_(s)
3337
{
3438
}
@@ -37,7 +41,7 @@ struct close_after
3741
boost::asio::chrono::steady_clock::duration timeout_;
3842

3943
// The socket to be closed if the operation does not complete in time.
40-
tcp::socket& socket_;
44+
tcp_socket& socket_;
4145
};
4246

4347
namespace boost {
@@ -125,7 +129,7 @@ class async_result<close_after, void(boost::system::error_code, T)>
125129

126130
private:
127131
boost::asio::chrono::steady_clock::duration timeout_;
128-
tcp::socket& socket_;
132+
tcp_socket& socket_;
129133
boost::system::error_code ec_;
130134
T t_;
131135
};
@@ -151,7 +155,7 @@ int main(int argc, char* argv[])
151155
tcp::resolver::results_type endpoints =
152156
tcp::resolver(io_context).resolve(argv[1], argv[2]);
153157

154-
tcp::socket socket(io_context);
158+
tcp_socket socket(io_context);
155159

156160
// Run an asynchronous connect operation with a timeout.
157161
boost::asio::async_connect(socket, endpoints,

example/cpp03/tutorial/daytime3/server.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ class tcp_server
7070
{
7171
public:
7272
tcp_server(boost::asio::io_context& io_context)
73-
: acceptor_(io_context, tcp::endpoint(tcp::v4(), 13))
73+
: io_context_(io_context),
74+
acceptor_(io_context, tcp::endpoint(tcp::v4(), 13))
7475
{
7576
start_accept();
7677
}
@@ -79,7 +80,7 @@ class tcp_server
7980
void start_accept()
8081
{
8182
tcp_connection::pointer new_connection =
82-
tcp_connection::create(acceptor_.get_executor().context());
83+
tcp_connection::create(io_context_);
8384

8485
acceptor_.async_accept(new_connection->socket(),
8586
boost::bind(&tcp_server::handle_accept, this, new_connection,
@@ -97,6 +98,7 @@ class tcp_server
9798
start_accept();
9899
}
99100

101+
boost::asio::io_context& io_context_;
100102
tcp::acceptor acceptor_;
101103
};
102104

0 commit comments

Comments
 (0)