]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/fiber/test/test_fiber_post.cpp
01a7e74c3c039879c8269143196599f9af6c65bc
2 // Copyright Oliver Kowalke 2013.
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
7 // This test is based on the tests of Boost.Thread
14 #include <boost/assert.hpp>
15 #include <boost/test/unit_test.hpp>
17 #include <boost/fiber/all.hpp>
20 std::string value2
= "";
65 moveable( moveable
&& other
) :
72 moveable
& operator=( moveable
&& other
) {
73 if ( this == & other
) return * this;
81 moveable( moveable
const& other
) = delete;
82 moveable
& operator=( moveable
const& other
) = delete;
94 static int alive_count
;
95 static bool was_running
;
102 detachable( detachable
const& g
) :
103 alive_count_( g
.alive_count_
) {
113 BOOST_CHECK_EQUAL(1, alive_count_
);
118 int detachable::alive_count
= 0;
119 bool detachable::was_running
= false;
125 void fn2( int i
, std::string
const& s
) {
132 boost::this_fiber::yield();
134 boost::this_fiber::yield();
136 boost::this_fiber::yield();
138 boost::this_fiber::yield();
140 boost::this_fiber::yield();
145 boost::this_fiber::yield();
149 boost::fibers::fiber
f( boost::fibers::launch::post
, fn4
);
150 BOOST_CHECK( f
.joinable() );
152 BOOST_CHECK( ! f
.joinable() );
155 void test_scheduler_dtor() {
156 boost::fibers::context
* ctx(
157 boost::fibers::context::active() );
161 void test_join_fn() {
164 boost::fibers::fiber
f( boost::fibers::launch::post
, fn1
);
166 BOOST_CHECK_EQUAL( value1
, 1);
171 boost::fibers::fiber
f( boost::fibers::launch::post
, fn2
, 3, "abc");
173 BOOST_CHECK_EQUAL( value1
, 3);
174 BOOST_CHECK_EQUAL( value2
, "abc");
178 void test_join_memfn() {
180 BOOST_CHECK_EQUAL( x
.value
, 0);
181 boost::fibers::fiber( boost::fibers::launch::post
, & X::foo
, & x
, 3).join();
182 BOOST_CHECK_EQUAL( x
.value
, 3);
185 void test_join_copyable() {
188 BOOST_CHECK( cp
.state
);
189 BOOST_CHECK_EQUAL( value1
, 0);
190 boost::fibers::fiber
f( boost::fibers::launch::post
, cp
);
192 BOOST_CHECK( cp
.state
);
193 BOOST_CHECK_EQUAL( value1
, 3);
196 void test_join_moveable() {
199 BOOST_CHECK( mv
.state
);
200 BOOST_CHECK_EQUAL( value1
, 0);
201 boost::fibers::fiber
f( boost::fibers::launch::post
, std::move( mv
) );
203 BOOST_CHECK( ! mv
.state
);
204 BOOST_CHECK_EQUAL( value1
, 7);
207 void test_join_lambda() {
212 std::string
abc("abc");
213 boost::fibers::fiber
f(
214 boost::fibers::launch::post
, [i
,abc
]() {
219 BOOST_CHECK_EQUAL( value1
, 3);
220 BOOST_CHECK_EQUAL( value2
, "abc");
226 std::string
abc("abc");
227 boost::fibers::fiber
f(
228 boost::fibers::launch::post
, [](int i
, std::string
const& abc
) {
234 BOOST_CHECK_EQUAL( value1
, 3);
235 BOOST_CHECK_EQUAL( value2
, "abc");
239 void test_join_bind() {
244 std::string
abc("abc");
245 boost::fibers::fiber
f(
246 boost::fibers::launch::post
, std::bind(
253 BOOST_CHECK_EQUAL( value1
, 3);
254 BOOST_CHECK_EQUAL( value2
, "abc");
259 std::string
abc("abc");
260 boost::fibers::fiber
f(
261 boost::fibers::launch::post
, std::bind(
262 [](std::string
& str
) {
269 BOOST_CHECK_EQUAL( value1
, 3);
270 BOOST_CHECK_EQUAL( value2
, "abc");
275 std::string
abc("abc");
276 boost::fibers::fiber
f(
277 boost::fibers::launch::post
, std::bind(
278 []( std::string
& str
) {
282 std::placeholders::_1
286 BOOST_CHECK_EQUAL( value1
, 3);
287 BOOST_CHECK_EQUAL( value2
, "abc");
291 void test_join_in_fiber() {
293 // f spawns an new fiber f' in its fiber-fn
294 // f' yields in its fiber-fn
295 // f joins s' and gets suspended (waiting on s')
296 boost::fibers::fiber
f( boost::fibers::launch::post
, fn5
);
297 BOOST_CHECK( f
.joinable() );
298 // join() resumes f + f' which completes
300 BOOST_CHECK( ! f
.joinable() );
303 void test_move_fiber() {
304 boost::fibers::fiber f1
;
305 BOOST_CHECK( ! f1
.joinable() );
306 boost::fibers::fiber
f2( boost::fibers::launch::post
, fn1
);
307 BOOST_CHECK( f2
.joinable() );
309 BOOST_CHECK( f1
.joinable() );
310 BOOST_CHECK( ! f2
.joinable() );
312 BOOST_CHECK( ! f1
.joinable() );
313 BOOST_CHECK( ! f2
.joinable() );
317 boost::fibers::fiber f1
;
318 boost::fibers::fiber
f2( boost::fibers::launch::post
, fn1
);
319 BOOST_CHECK( ! f1
.joinable() );
320 BOOST_CHECK( f2
.joinable() );
322 BOOST_CHECK_EQUAL( boost::fibers::fiber::id(), f1
.get_id() );
323 BOOST_CHECK( boost::fibers::fiber::id() != f2
.get_id() );
325 boost::fibers::fiber
f3( boost::fibers::launch::post
, fn1
);
326 BOOST_CHECK( f2
.get_id() != f3
.get_id() );
329 BOOST_CHECK( f1
.joinable() );
330 BOOST_CHECK( ! f2
.joinable() );
332 BOOST_CHECK( boost::fibers::fiber::id() != f1
.get_id() );
333 BOOST_CHECK_EQUAL( boost::fibers::fiber::id(), f2
.get_id() );
335 BOOST_CHECK( ! f2
.joinable() );
343 BOOST_CHECK_EQUAL( 0, v1
);
344 BOOST_CHECK_EQUAL( 0, v2
);
345 boost::fibers::fiber
f1( boost::fibers::launch::post
, fn3
, std::ref( v1
) );
346 boost::fibers::fiber
f2( boost::fibers::launch::post
, fn3
, std::ref( v2
) );
349 BOOST_CHECK( ! f1
.joinable() );
350 BOOST_CHECK( ! f2
.joinable() );
351 BOOST_CHECK_EQUAL( 8, v1
);
352 BOOST_CHECK_EQUAL( 8, v2
);
355 void test_sleep_for() {
356 typedef std::chrono::system_clock Clock
;
357 typedef Clock::time_point time_point
;
358 std::chrono::milliseconds
ms(500);
359 time_point t0
= Clock::now();
360 boost::this_fiber::sleep_for(ms
);
361 time_point t1
= Clock::now();
362 std::chrono::nanoseconds ns
= (t1
- t0
) - ms
;
363 std::chrono::nanoseconds err
= ms
/ 10;
364 // This test is spurious as it depends on the time the fiber system switches the fiber
365 BOOST_CHECK((std::max
)(ns
.count(), -ns
.count()) < (err
+std::chrono::milliseconds(1000)).count());
368 void test_sleep_until() {
370 typedef std::chrono::steady_clock Clock
;
371 typedef Clock::time_point time_point
;
372 std::chrono::milliseconds
ms(500);
373 time_point t0
= Clock::now();
374 boost::this_fiber::sleep_until(t0
+ ms
);
375 time_point t1
= Clock::now();
376 std::chrono::nanoseconds ns
= (t1
- t0
) - ms
;
377 std::chrono::nanoseconds err
= ms
/ 10;
378 // This test is spurious as it depends on the time the thread system switches the threads
379 BOOST_CHECK((std::max
)(ns
.count(), -ns
.count()) < (err
+std::chrono::milliseconds(1000)).count());
382 typedef std::chrono::system_clock Clock
;
383 typedef Clock::time_point time_point
;
384 std::chrono::milliseconds
ms(500);
385 time_point t0
= Clock::now();
386 boost::this_fiber::sleep_until(t0
+ ms
);
387 time_point t1
= Clock::now();
388 std::chrono::nanoseconds ns
= (t1
- t0
) - ms
;
389 std::chrono::nanoseconds err
= ms
/ 10;
390 // This test is spurious as it depends on the time the thread system switches the threads
391 BOOST_CHECK((std::max
)(ns
.count(), -ns
.count()) < (err
+std::chrono::milliseconds(1000)).count());
395 void do_wait( boost::fibers::barrier
* b
) {
401 boost::fibers::fiber
f( boost::fibers::launch::post
, (detachable()) );
402 BOOST_CHECK( f
.joinable() );
404 BOOST_CHECK( ! f
.joinable() );
405 boost::this_fiber::sleep_for( std::chrono::milliseconds(250) );
406 BOOST_CHECK( detachable::was_running
);
407 BOOST_CHECK_EQUAL( 0, detachable::alive_count
);
410 boost::fibers::fiber
f( boost::fibers::launch::post
, (detachable()) );
411 BOOST_CHECK( f
.joinable() );
412 boost::this_fiber::yield();
414 BOOST_CHECK( ! f
.joinable() );
415 boost::this_fiber::sleep_for( std::chrono::milliseconds(250) );
416 BOOST_CHECK( detachable::was_running
);
417 BOOST_CHECK_EQUAL( 0, detachable::alive_count
);
421 boost::unit_test::test_suite
* init_unit_test_suite( int, char* []) {
422 boost::unit_test::test_suite
* test
=
423 BOOST_TEST_SUITE("Boost.Fiber: fiber test suite");
425 test
->add( BOOST_TEST_CASE( & test_scheduler_dtor
) );
426 test
->add( BOOST_TEST_CASE( & test_join_fn
) );
427 test
->add( BOOST_TEST_CASE( & test_join_memfn
) );
428 test
->add( BOOST_TEST_CASE( & test_join_copyable
) );
429 test
->add( BOOST_TEST_CASE( & test_join_moveable
) );
430 test
->add( BOOST_TEST_CASE( & test_join_lambda
) );
431 test
->add( BOOST_TEST_CASE( & test_join_bind
) );
432 test
->add( BOOST_TEST_CASE( & test_join_in_fiber
) );
433 test
->add( BOOST_TEST_CASE( & test_move_fiber
) );
434 test
->add( BOOST_TEST_CASE( & test_yield
) );
435 test
->add( BOOST_TEST_CASE( & test_sleep_for
) );
436 test
->add( BOOST_TEST_CASE( & test_sleep_until
) );
437 test
->add( BOOST_TEST_CASE( & test_detach
) );