5 // Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)
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)
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)
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)
21 // Test that header file is self-contained.
22 #include <boost/asio/system_executor.hpp>
24 #include <boost/asio/dispatch.hpp>
25 #include <boost/asio/post.hpp>
26 #include "unit_test.hpp"
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)
34 using namespace boost::asio
;
36 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
37 namespace bindns
= boost
;
38 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
39 namespace bindns
= std
;
42 void increment(boost::asio::detail::atomic_count
* count
)
47 void system_executor_query_test()
50 &boost::asio::query(system_executor(),
51 boost::asio::execution::context
)
52 != static_cast<const system_context
*>(0));
55 boost::asio::query(system_executor(),
56 boost::asio::execution::blocking
)
57 == boost::asio::execution::blocking
.possibly
);
60 boost::asio::query(system_executor(),
61 boost::asio::execution::blocking
.possibly
)
62 == boost::asio::execution::blocking
.possibly
);
65 boost::asio::query(system_executor(),
66 boost::asio::execution::outstanding_work
)
67 == boost::asio::execution::outstanding_work
.untracked
);
70 boost::asio::query(system_executor(),
71 boost::asio::execution::outstanding_work
.untracked
)
72 == boost::asio::execution::outstanding_work
.untracked
);
75 boost::asio::query(system_executor(),
76 boost::asio::execution::relationship
)
77 == boost::asio::execution::relationship
.fork
);
80 boost::asio::query(system_executor(),
81 boost::asio::execution::relationship
.fork
)
82 == boost::asio::execution::relationship
.fork
);
85 boost::asio::query(system_executor(),
86 boost::asio::execution::bulk_guarantee
)
87 == boost::asio::execution::bulk_guarantee
.unsequenced
);
90 boost::asio::query(system_executor(),
91 boost::asio::execution::mapping
)
92 == boost::asio::execution::mapping
.thread
);
95 boost::asio::query(system_executor(),
96 boost::asio::execution::allocator
)
97 == std::allocator
<void>());
100 void system_executor_execute_test()
102 boost::asio::detail::atomic_count
count(0);
104 boost::asio::execution::execute(system_executor(),
105 bindns::bind(increment
, &count
));
107 boost::asio::execution::execute(
108 boost::asio::require(system_executor(),
109 boost::asio::execution::blocking
.possibly
),
110 bindns::bind(increment
, &count
));
112 boost::asio::execution::execute(
113 boost::asio::require(system_executor(),
114 boost::asio::execution::blocking
.always
),
115 bindns::bind(increment
, &count
));
117 boost::asio::execution::execute(
118 boost::asio::require(system_executor(),
119 boost::asio::execution::blocking
.never
),
120 bindns::bind(increment
, &count
));
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
));
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
));
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
));
142 boost::asio::execution::execute(
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
));
151 boost::asio::execution::execute(
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
));
160 boost::asio::query(system_executor(), execution::context
).join();
162 BOOST_ASIO_CHECK(count
== 9);
165 BOOST_ASIO_TEST_SUITE
168 BOOST_ASIO_TEST_CASE(system_executor_query_test
)
169 BOOST_ASIO_TEST_CASE(system_executor_execute_test
)