// Copyright Oliver Kowalke 2009. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include #include #include #include #include #include int value = 0; void wait_fn( boost::fibers::count_down_event & ev) { ev.wait(); ++value; } void fn1() { boost::fibers::count_down_event ev( 3); BOOST_CHECK_EQUAL( ev.initial(), ( std::size_t)3); BOOST_CHECK_EQUAL( ev.current(), ( std::size_t)3); ev.set(); BOOST_CHECK_EQUAL( ev.initial(), ( std::size_t)3); BOOST_CHECK_EQUAL( ev.current(), ( std::size_t)2); ev.set(); BOOST_CHECK_EQUAL( ev.initial(), ( std::size_t)3); BOOST_CHECK_EQUAL( ev.current(), ( std::size_t)1); ev.set(); BOOST_CHECK_EQUAL( ev.initial(), ( std::size_t)3); BOOST_CHECK_EQUAL( ev.current(), ( std::size_t)0); ev.set(); BOOST_CHECK_EQUAL( ev.initial(), ( std::size_t)3); BOOST_CHECK_EQUAL( ev.current(), ( std::size_t)0); } void fn2() { value = 0; boost::fibers::count_down_event ev( 3); BOOST_CHECK_EQUAL( ev.initial(), ( std::size_t)3); BOOST_CHECK_EQUAL( ev.current(), ( std::size_t)3); boost::fibers::fiber s( boost::bind( wait_fn, boost::ref( ev) ) ); BOOST_CHECK_EQUAL( 0, value); BOOST_CHECK( ! boost::fibers::run() ); BOOST_CHECK_EQUAL( 0, value); ev.set(); BOOST_CHECK( ! boost::fibers::run() ); BOOST_CHECK_EQUAL( 0, value); ev.set(); BOOST_CHECK( ! boost::fibers::run() ); BOOST_CHECK_EQUAL( 0, value); ev.set(); BOOST_CHECK( boost::fibers::run() ); BOOST_CHECK_EQUAL( ev.initial(), ( std::size_t)3); BOOST_CHECK_EQUAL( ev.current(), ( std::size_t)0); BOOST_CHECK_EQUAL( 1, value); } void test_count_down() { boost::fibers::round_robin ds; boost::fibers::scheduling_algorithm( & ds); boost::fibers::fiber( fn1).join(); fn1(); } void test_wait() { boost::fibers::round_robin ds; boost::fibers::scheduling_algorithm( & ds); boost::fibers::fiber( fn2).join(); fn2(); } boost::unit_test::test_suite * init_unit_test_suite( int, char* []) { boost::unit_test::test_suite * test = BOOST_TEST_SUITE("Boost.Fiber: count_down_event test suite"); test->add( BOOST_TEST_CASE( & test_count_down) ); test->add( BOOST_TEST_CASE( & test_wait) ); return test; }