1 //
2 // system_executor.cpp
3 // ~~~~~~~~~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6 //
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 //
10 
11 // Disable autolinking for unit tests.
12 #if !defined(BOOST_ALL_NO_LIB)
13 #define BOOST_ALL_NO_LIB 1
14 #endif // !defined(BOOST_ALL_NO_LIB)
15 
16 // Prevent link dependency on the Boost.System library.
17 #if !defined(BOOST_SYSTEM_NO_DEPRECATED)
18 #define BOOST_SYSTEM_NO_DEPRECATED
19 #endif // !defined(BOOST_SYSTEM_NO_DEPRECATED)
20 
21 // Test that header file is self-contained.
22 #include <boost/asio/system_executor.hpp>
23 
24 #include <boost/asio/dispatch.hpp>
25 #include <boost/asio/post.hpp>
26 #include "unit_test.hpp"
27 
28 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
29 # include <boost/bind/bind.hpp>
30 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
31 # include <functional>
32 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
33 
34 using namespace boost::asio;
35 
36 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
37 namespace bindns = boost;
38 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
39 namespace bindns = std;
40 #endif
41 
increment(boost::asio::detail::atomic_count * count)42 void increment(boost::asio::detail::atomic_count* count)
43 {
44   ++(*count);
45 }
46 
system_executor_query_test()47 void system_executor_query_test()
48 {
49   BOOST_ASIO_CHECK(
50       &boost::asio::query(system_executor(),
51         boost::asio::execution::context)
52       != static_cast<const system_context*>(0));
53 
54   BOOST_ASIO_CHECK(
55       boost::asio::query(system_executor(),
56         boost::asio::execution::blocking)
57       == boost::asio::execution::blocking.possibly);
58 
59   BOOST_ASIO_CHECK(
60       boost::asio::query(system_executor(),
61         boost::asio::execution::blocking.possibly)
62       == boost::asio::execution::blocking.possibly);
63 
64   BOOST_ASIO_CHECK(
65       boost::asio::query(system_executor(),
66         boost::asio::execution::outstanding_work)
67       == boost::asio::execution::outstanding_work.untracked);
68 
69   BOOST_ASIO_CHECK(
70       boost::asio::query(system_executor(),
71         boost::asio::execution::outstanding_work.untracked)
72       == boost::asio::execution::outstanding_work.untracked);
73 
74   BOOST_ASIO_CHECK(
75       boost::asio::query(system_executor(),
76         boost::asio::execution::relationship)
77       == boost::asio::execution::relationship.fork);
78 
79   BOOST_ASIO_CHECK(
80       boost::asio::query(system_executor(),
81         boost::asio::execution::relationship.fork)
82       == boost::asio::execution::relationship.fork);
83 
84   BOOST_ASIO_CHECK(
85       boost::asio::query(system_executor(),
86         boost::asio::execution::bulk_guarantee)
87       == boost::asio::execution::bulk_guarantee.unsequenced);
88 
89   BOOST_ASIO_CHECK(
90       boost::asio::query(system_executor(),
91         boost::asio::execution::mapping)
92       == boost::asio::execution::mapping.thread);
93 
94   BOOST_ASIO_CHECK(
95       boost::asio::query(system_executor(),
96         boost::asio::execution::allocator)
97       == std::allocator<void>());
98 }
99 
system_executor_execute_test()100 void system_executor_execute_test()
101 {
102   boost::asio::detail::atomic_count count(0);
103 
104   boost::asio::execution::execute(system_executor(),
105       bindns::bind(increment, &count));
106 
107   boost::asio::execution::execute(
108       boost::asio::require(system_executor(),
109         boost::asio::execution::blocking.possibly),
110       bindns::bind(increment, &count));
111 
112   boost::asio::execution::execute(
113       boost::asio::require(system_executor(),
114         boost::asio::execution::blocking.always),
115       bindns::bind(increment, &count));
116 
117   boost::asio::execution::execute(
118       boost::asio::require(system_executor(),
119         boost::asio::execution::blocking.never),
120       bindns::bind(increment, &count));
121 
122   boost::asio::execution::execute(
123       boost::asio::require(system_executor(),
124         boost::asio::execution::blocking.never,
125         boost::asio::execution::outstanding_work.untracked),
126       bindns::bind(increment, &count));
127 
128   boost::asio::execution::execute(
129       boost::asio::require(system_executor(),
130         boost::asio::execution::blocking.never,
131         boost::asio::execution::outstanding_work.untracked,
132         boost::asio::execution::relationship.fork),
133       bindns::bind(increment, &count));
134 
135   boost::asio::execution::execute(
136       boost::asio::require(system_executor(),
137         boost::asio::execution::blocking.never,
138         boost::asio::execution::outstanding_work.untracked,
139         boost::asio::execution::relationship.continuation),
140       bindns::bind(increment, &count));
141 
142   boost::asio::execution::execute(
143       boost::asio::prefer(
144         boost::asio::require(system_executor(),
145           boost::asio::execution::blocking.never,
146           boost::asio::execution::outstanding_work.untracked,
147           boost::asio::execution::relationship.continuation),
148         boost::asio::execution::allocator(std::allocator<void>())),
149       bindns::bind(increment, &count));
150 
151   boost::asio::execution::execute(
152       boost::asio::prefer(
153         boost::asio::require(system_executor(),
154           boost::asio::execution::blocking.never,
155           boost::asio::execution::outstanding_work.untracked,
156           boost::asio::execution::relationship.continuation),
157         boost::asio::execution::allocator),
158       bindns::bind(increment, &count));
159 
160   boost::asio::query(system_executor(), execution::context).join();
161 
162   BOOST_ASIO_CHECK(count == 9);
163 }
164 
165 BOOST_ASIO_TEST_SUITE
166 (
167   "system_executor",
168   BOOST_ASIO_TEST_CASE(system_executor_query_test)
169   BOOST_ASIO_TEST_CASE(system_executor_execute_test)
170 )
171