diff --git a/include/boost/fiber/detail/fiber_base.hpp b/include/boost/fiber/detail/fiber_base.hpp index d2b0d073..adb7cc33 100644 --- a/include/boost/fiber/detail/fiber_base.hpp +++ b/include/boost/fiber/detail/fiber_base.hpp @@ -193,26 +193,7 @@ public: BOOST_ASSERT( state_running == previous || state_ready == previous); } - void set_ready() BOOST_NOEXCEPT - { - // this fiber calls set_ready(): - only transition from state_waiting (wake-up) - // - or transition from state_running (yield) allowed - // other fiber calls set_ready(): - only if this fiber was joinig other fiber - // - if this fiber was not interrupted then this fiber - // should in state_waiting - // - if this fiber was interrupted the this fiber might - // be in state_ready, state_running or already in - // state_terminated - for (;;) - { - state_t expected = state_waiting; - bool result = state_.compare_exchange_strong( expected, state_ready, memory_order_release); - if ( result || state_terminated == expected || state_ready == expected) return; - expected = state_running; - result = state_.compare_exchange_strong( expected, state_ready, memory_order_release); - if ( result || state_terminated == expected || state_ready == expected) return; - } - } + void set_ready() BOOST_NOEXCEPT; void set_running() BOOST_NOEXCEPT { @@ -238,6 +219,11 @@ public: state_t state() const BOOST_NOEXCEPT { return state_; } + bool has_exception() const BOOST_NOEXCEPT + { return except_; } + + void rethrow() const; + friend inline void intrusive_ptr_add_ref( fiber_base * p) BOOST_NOEXCEPT { p->use_count_.fetch_add( 1, memory_order_relaxed); } diff --git a/include/boost/fiber/fiber.hpp b/include/boost/fiber/fiber.hpp index 4e965653..1f9a201d 100644 --- a/include/boost/fiber/fiber.hpp +++ b/include/boost/fiber/fiber.hpp @@ -322,7 +322,7 @@ public: { return ! impl_; } bool joinable() const BOOST_NOEXCEPT - { return ! empty() && ! impl_->is_terminated(); } + { return ! empty(); } id get_id() const BOOST_NOEXCEPT { return impl_ ? impl_->get_id() : id(); } diff --git a/include/boost/fiber/future.hpp b/include/boost/fiber/future.hpp index d398d6d3..cb4be7d7 100644 --- a/include/boost/fiber/future.hpp +++ b/include/boost/fiber/future.hpp @@ -1378,7 +1378,7 @@ namespace fibers { packaged_task_type pt( f); unique_future ret = pt.get_future(); - fiber( boost::move(pt) ); + fiber( boost::move(pt) ).detach(); return boost::move( ret); } @@ -1392,7 +1392,7 @@ namespace fibers { packaged_task_type pt( boost::forward(f) ); unique_future ret = pt.get_future(); - fiber( boost::move(pt) ); + fiber( boost::move(pt) ).detach(); return boost::move( ret); } diff --git a/src/detail/fiber_base.cpp b/src/detail/fiber_base.cpp index 9300c99a..95577506 100644 --- a/src/detail/fiber_base.cpp +++ b/src/detail/fiber_base.cpp @@ -39,7 +39,7 @@ fiber_base::resume() { context::jump_fcontext( & caller_, callee_, 0, preserve_fpu() ); - if ( except_) rethrow_exception( except_); + if ( has_exception() ) rethrow(); } void @@ -73,6 +73,37 @@ fiber_base::join( ptr_t const& p) return true; } +void +fiber_base::rethrow() const +{ + BOOST_ASSERT( has_exception() ); + + rethrow_exception( except_); +} + + +void +fiber_base::set_ready() +{ + // this fiber calls set_ready(): - only transition from state_waiting (wake-up) + // - or transition from state_running (yield) allowed + // other fiber calls set_ready(): - only if this fiber was joinig other fiber + // - if this fiber was not interrupted then this fiber + // should in state_waiting + // - if this fiber was interrupted the this fiber might + // be in state_ready, state_running or already in + // state_terminated + for (;;) + { + state_t expected = state_waiting; + bool result = state_.compare_exchange_strong( expected, state_ready, memory_order_release); + if ( result || state_terminated == expected || state_ready == expected) return; + expected = state_running; + result = state_.compare_exchange_strong( expected, state_ready, memory_order_release); + if ( result || state_terminated == expected || state_ready == expected) return; + } +} + }}} #ifdef BOOST_HAS_ABI_HEADERS diff --git a/src/fiber.cpp b/src/fiber.cpp index b7fc7fa4..666db42a 100644 --- a/src/fiber.cpp +++ b/src/fiber.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -55,15 +56,16 @@ fiber::join() if ( ! joinable() ) { - if ( impl_->is_terminated() ) return; boost::throw_exception( fiber_resource_error( system::errc::invalid_argument, "boost fiber: fiber not joinable") ); } + BOOST_SCOPE_EXIT( & impl_) { + BOOST_ASSERT( impl_->is_terminated() ); + impl_.reset(); + } BOOST_SCOPE_EXIT_END detail::scheduler::instance().join( impl_); - - BOOST_ASSERT( impl_->is_terminated() ); } void diff --git a/src/round_robin.cpp b/src/round_robin.cpp index ca66e4f2..42dc162b 100644 --- a/src/round_robin.cpp +++ b/src/round_robin.cpp @@ -90,8 +90,6 @@ round_robin::join( detail::fiber_base::ptr_t const& f) BOOST_ASSERT( f); BOOST_ASSERT( f != active_fiber_); - if ( f->is_terminated() ) return; - if ( active_fiber_) { // set active fiber to state_waiting @@ -121,6 +119,10 @@ round_robin::join( detail::fiber_base::ptr_t const& f) } } + // check if joined fiber has an exception + // rethrow exception if YES + if ( f->has_exception() ) f->rethrow(); + BOOST_ASSERT( f->is_terminated() ); } diff --git a/test/test_fiber.cpp b/test/test_fiber.cpp index 63169367..ae5ccc44 100644 --- a/test/test_fiber.cpp +++ b/test/test_fiber.cpp @@ -159,16 +159,20 @@ void test_move() s1 = boost::move( s2); BOOST_CHECK( ! s1.empty() ); BOOST_CHECK( s2.empty() ); + if ( s1.joinable() ) s1.join(); + if ( s2.joinable() ) s2.join(); } { copyable cp( 3); boost::fibers::fiber s( cp); + s.join(); } { moveable mv( 7); boost::fibers::fiber s( boost::move( mv) ); + s.join(); } } @@ -181,6 +185,7 @@ void test_priority() BOOST_CHECK_EQUAL( 0, f.priority() ); f.priority( 7); BOOST_CHECK_EQUAL( 7, f.priority() ); + f.join(); } void test_id() @@ -205,6 +210,10 @@ void test_id() BOOST_CHECK( boost::fibers::fiber::id() != s1.get_id() ); BOOST_CHECK_EQUAL( boost::fibers::fiber::id(), s2.get_id() ); + + if ( s1.joinable() ) s1.join(); + if ( s2.joinable() ) s2.join(); + if ( s3.joinable() ) s3.join(); } void test_detach() @@ -217,6 +226,7 @@ void test_detach() BOOST_CHECK( ! s1); s1.detach(); BOOST_CHECK( ! s1); + BOOST_CHECK( ! s1.joinable() ); } { @@ -224,6 +234,7 @@ void test_detach() BOOST_CHECK( s2); s2.detach(); BOOST_CHECK( ! s2); + BOOST_CHECK( ! s2.joinable() ); } } @@ -304,7 +315,7 @@ void test_yield_break() boost::fibers::scheduling_algorithm( & ds); boost::fibers::fiber s( f5); - if ( s.joinable() ) s.join(); + s.join(); BOOST_CHECK( ! s); } @@ -318,8 +329,8 @@ void test_yield() BOOST_CHECK_EQUAL( 0, v2); boost::fibers::fiber s1( boost::bind( f6, boost::ref( v1) ) ); boost::fibers::fiber s2( boost::bind( f6, boost::ref( v2) ) ); - if ( s1.joinable() ) s1.join(); - if ( s2.joinable() ) s2.join(); + s1.join(); + s2.join(); BOOST_CHECK( ! s1); BOOST_CHECK( ! s2); BOOST_CHECK_EQUAL( 8, v1); @@ -375,7 +386,6 @@ void test_fiber_interrupts_at_join() BOOST_CHECK_EQUAL( 1, i); f2.join(); BOOST_CHECK_EQUAL( 1, i); - f1.join(); BOOST_CHECK( failed); BOOST_CHECK_EQUAL( 1, i); } diff --git a/test/test_futures.cpp b/test/test_futures.cpp index dbbafa2b..0f6556e7 100644 --- a/test/test_futures.cpp +++ b/test/test_futures.cpp @@ -74,7 +74,7 @@ void future_wait() boost::fibers::packaged_task pt(boost::bind( echo, 42)); boost::fibers::unique_future f(pt.get_future()); - boost::fibers::fiber s( boost::move(pt) ); + boost::fibers::fiber( boost::move(pt) ).detach(); f.wait(); int i = f.get(); @@ -135,8 +135,8 @@ void store_value_from_thread() { boost::fibers::promise pi2; boost::fibers::unique_future fi2(pi2.get_future()); - boost::fibers::fiber s( - boost::bind( set_promise_thread,&pi2) ); + boost::fibers::fiber( + boost::bind( set_promise_thread,&pi2) ).detach(); int j=fi2.get(); BOOST_CHECK(j==42); BOOST_CHECK(fi2.is_ready()); @@ -150,8 +150,8 @@ void store_exception() { boost::fibers::promise pi3; boost::fibers::unique_future fi3=pi3.get_future(); - boost::fibers::fiber s( - boost::bind( set_promise_exception_thread,&pi3) ); + boost::fibers::fiber( + boost::bind( set_promise_exception_thread,&pi3) ).detach(); try { fi3.get(); @@ -701,7 +701,7 @@ void wait_for_either_of_two_futures_1() boost::fibers::packaged_task pt2(make_int_slowly); boost::fibers::unique_future f2(pt2.get_future()); - boost::fibers::fiber s( boost::move(pt) ); + boost::fibers::fiber( boost::move(pt) ).detach(); unsigned const future=boost::fibers::waitfor_any(f1,f2); @@ -718,7 +718,7 @@ void wait_for_either_of_two_futures_2() boost::fibers::packaged_task pt2(make_int_slowly); boost::fibers::unique_future f2(pt2.get_future()); - boost::fibers::fiber s( boost::move(pt2) ); + boost::fibers::fiber( boost::move(pt2) ).detach(); unsigned const future=boost::fibers::waitfor_any(f1,f2); @@ -737,7 +737,7 @@ void wait_for_either_of_three_futures_1() boost::fibers::packaged_task pt3(make_int_slowly); boost::fibers::unique_future f3(pt3.get_future()); - boost::fibers::fiber s( boost::move(pt) ); + boost::fibers::fiber( boost::move(pt) ).detach(); unsigned const future=boost::fibers::waitfor_any(f1,f2,f3); @@ -757,7 +757,7 @@ void wait_for_either_of_three_futures_2() boost::fibers::packaged_task pt3(make_int_slowly); boost::fibers::unique_future f3(pt3.get_future()); - boost::fibers::fiber s( boost::move(pt2) ); + boost::fibers::fiber( boost::move(pt2) ).detach(); unsigned const future=boost::fibers::waitfor_any(f1,f2,f3); @@ -777,7 +777,7 @@ void wait_for_either_of_three_futures_3() boost::fibers::packaged_task pt3(make_int_slowly); boost::fibers::unique_future f3(pt3.get_future()); - boost::fibers::fiber s( boost::move(pt3) ); + boost::fibers::fiber( boost::move(pt3) ).detach(); unsigned const future=boost::fibers::waitfor_any(f1,f2,f3); @@ -822,7 +822,7 @@ void wait_for_either_of_four_futures_2() boost::fibers::packaged_task pt4(make_int_slowly); boost::fibers::unique_future f4(pt4.get_future()); - boost::fibers::fiber x(boost::move(pt2)); + boost::fibers::fiber(boost::move(pt2)).detach(); unsigned const future=boost::fibers::waitfor_any(f1,f2,f3,f4); @@ -845,7 +845,7 @@ void wait_for_either_of_four_futures_3() boost::fibers::packaged_task pt4(make_int_slowly); boost::fibers::unique_future f4(pt4.get_future()); - boost::fibers::fiber x(boost::move(pt3)); + boost::fibers::fiber(boost::move(pt3)).detach(); unsigned const future=boost::fibers::waitfor_any(f1,f2,f3,f4); @@ -868,7 +868,7 @@ void wait_for_either_of_four_futures_4() boost::fibers::packaged_task pt4(make_int_slowly); boost::fibers::unique_future f4(pt4.get_future()); - boost::fibers::fiber x(boost::move(pt4)); + boost::fibers::fiber(boost::move(pt4)).detach(); unsigned const future=boost::fibers::waitfor_any(f1,f2,f3,f4); @@ -919,7 +919,7 @@ void wait_for_either_of_five_futures_2() boost::fibers::packaged_task pt5(make_int_slowly); boost::fibers::unique_future f5(pt5.get_future()); - boost::fibers::fiber x(boost::move(pt2)); + boost::fibers::fiber(boost::move(pt2)).detach(); unsigned const future=boost::fibers::waitfor_any(f1,f2,f3,f4,f5); @@ -944,7 +944,7 @@ void wait_for_either_of_five_futures_3() boost::fibers::packaged_task pt5(make_int_slowly); boost::fibers::unique_future f5(pt5.get_future()); - boost::fibers::fiber x(boost::move(pt3)); + boost::fibers::fiber(boost::move(pt3)).detach(); unsigned const future=boost::fibers::waitfor_any(f1,f2,f3,f4,f5); @@ -969,7 +969,7 @@ void wait_for_either_of_five_futures_4() boost::fibers::packaged_task pt5(make_int_slowly); boost::fibers::unique_future f5(pt5.get_future()); - boost::fibers::fiber x(boost::move(pt4)); + boost::fibers::fiber(boost::move(pt4)).detach(); unsigned const future=boost::fibers::waitfor_any(f1,f2,f3,f4,f5); @@ -994,7 +994,7 @@ void wait_for_either_of_five_futures_5() boost::fibers::packaged_task pt5(make_int_slowly); boost::fibers::unique_future f5(pt5.get_future()); - boost::fibers::fiber x(boost::move(pt5)); + boost::fibers::fiber(boost::move(pt5)).detach(); unsigned const future=boost::fibers::waitfor_any(f1,f2,f3,f4,f5); @@ -1016,7 +1016,7 @@ void wait_for_either_invokes_callbacks() boost::fibers::unique_future fi2=pt2.get_future(); pt.set_wait_callback(wait_callback_for_task); - boost::fibers::fiber f(boost::move(pt)); + boost::fibers::fiber(boost::move(pt)).detach(); boost::fibers::waitfor_any(fi,fi2); BOOST_CHECK(fi.get()==42); @@ -1104,7 +1104,7 @@ void wait_for_all_three_futures() { boost::fibers::packaged_task task(make_int_slowly); futures[j]=task.get_future(); - boost::fibers::fiber x(boost::move(task)); + boost::fibers::fiber(boost::move(task)).detach(); } boost::fibers::waitfor_all(futures[0],futures[1],futures[2]); @@ -1123,7 +1123,7 @@ void wait_for_all_four_futures() { boost::fibers::packaged_task task(make_int_slowly); futures[j]=task.get_future(); - boost::fibers::fiber x(boost::move(task)); + boost::fibers::fiber(boost::move(task)).detach(); } boost::fibers::waitfor_all(futures[0],futures[1],futures[2],futures[3]); @@ -1142,7 +1142,7 @@ void wait_for_all_five_futures() { boost::fibers::packaged_task task(make_int_slowly); futures[j]=task.get_future(); - boost::fibers::fiber x(boost::move(task)); + boost::fibers::fiber(boost::move(task)).detach(); } boost::fibers::waitfor_all(futures[0],futures[1],futures[2],futures[3],futures[4]); diff --git a/test/test_round_robin.cpp b/test/test_round_robin.cpp index c790208b..5cbe27fe 100644 --- a/test/test_round_robin.cpp +++ b/test/test_round_robin.cpp @@ -13,202 +13,214 @@ #include -int value1 = 0; -int value2 = 0; - boost::fibers::round_robin * other_ds = 0; boost::fibers::fiber * other_f = 0; -void lazy_generate_running( boost::barrier & b) +void lazy_generate( boost::barrier * b, int * value) { - value1 = 1; + * value = 1; boost::this_fiber::yield(); - b.wait(); - value1 = 2; + + if ( b) b->wait(); + + * value = 2; boost::this_fiber::yield(); boost::this_fiber::interruption_point(); - value1 = 3; + * value = 3; boost::this_fiber::yield(); boost::this_fiber::interruption_point(); - value1 = 4; + * value = 4; boost::this_fiber::yield(); boost::this_fiber::interruption_point(); - value1 = 5; + * value = 5; boost::this_fiber::yield(); boost::this_fiber::interruption_point(); - value1 = 6; + * value = 6; } -void lazy_generate() +void join_fiber( boost::barrier * b, int * value, bool * interrupted) { - value1 = 1; - boost::this_fiber::yield(); - value1 = 2; - boost::this_fiber::yield(); - value1 = 3; - boost::this_fiber::yield(); - value1 = 4; - boost::this_fiber::yield(); - value1 = 5; - boost::this_fiber::yield(); - value1 = 6; + b->wait(); + try + { + other_f->join(); + * value = 7; + } + catch ( boost::fibers::fiber_interrupted const&) + { * interrupted = true; } } -void join_other( boost::barrier & b) +void interrupt_join_fiber( boost::barrier * b, int * value, bool * interrupted) { - fprintf(stderr, "1\n"); - b.wait(); - fprintf(stderr, "2\n"); - other_f->join(); - fprintf(stderr, "3\n"); - BOOST_CHECK_EQUAL( 6, value1); - value2 = 7; -} - -void join_interrupt_other( boost::barrier & b) -{ - b.wait(); + b->wait(); other_f->interrupt(); - other_f->join(); - BOOST_CHECK_EQUAL( 6, value1); - value2 = 7; + try + { + other_f->join(); + * value = 7; + } + catch ( boost::fibers::fiber_interrupted const&) + { * interrupted = true; } } -void fn_running( boost::barrier & b) + + +void fn_running( boost::barrier * b, int * value) { boost::fibers::round_robin ds; boost::fibers::scheduling_algorithm( & ds); other_ds = & ds; other_f = new boost::fibers::fiber( - boost::bind( lazy_generate_running, boost::ref( b) ) ); - other_f->join(); + boost::bind( lazy_generate, b, value) ); + // other_f will joined by another fiber } -void fn_terminated( boost::barrier & b) +void fn_terminated( boost::barrier * b, int * value) { boost::fibers::round_robin ds; boost::fibers::scheduling_algorithm( & ds); other_ds = & ds; - other_f = new boost::fibers::fiber( lazy_generate); - other_f->join(); - b.wait(); -} - -void fn_interrupted_inside( boost::barrier & b) -{ - boost::fibers::round_robin ds; - boost::fibers::scheduling_algorithm( & ds); - other_ds = & ds; - - bool interrupted = false; other_f = new boost::fibers::fiber( - boost::bind( lazy_generate_running, boost::ref( b) ) ); - fprintf( stderr, "other_f->interrupt()\n"); + boost::bind( lazy_generate, ( boost::barrier *) 0, value) ); + other_f->join(); + b->wait(); +} + +void fn_interrupt_from_same_thread( boost::barrier * b, int * value, bool * interrupted) +{ + boost::fibers::round_robin ds; + boost::fibers::scheduling_algorithm( & ds); + + other_f = new boost::fibers::fiber( + boost::bind( lazy_generate, b, value) ); other_f->interrupt(); - fprintf( stderr, "other_f->join()\n"); try { other_f->join(); } catch ( boost::fibers::fiber_interrupted const&) - { interrupted = true; } - BOOST_CHECK( interrupted); - fprintf( stderr, "fn_interrupted_inside() finished\n"); + { * interrupted = true; } } -void fn_join( boost::barrier & b) +void fn_join( boost::barrier * b, int * value, bool * interrupted) +{ + boost::fibers::round_robin ds; + boost::fibers::scheduling_algorithm( & ds); + + join_fiber( b, value, interrupted); +} + +void fn_join_in_fiber( boost::barrier * b, int * value, bool * interrupted) { boost::fibers::round_robin ds; boost::fibers::scheduling_algorithm( & ds); boost::fibers::fiber( - boost::bind( join_other, boost::ref( b) ) ).join(); + boost::bind( join_fiber, b, value, interrupted) ).join(); } -void fn_join_interrupt( boost::barrier & b) +void fn_join_interrupt( boost::barrier * b, int * value, bool * interrupted) { boost::fibers::round_robin ds; boost::fibers::scheduling_algorithm( & ds); boost::fibers::fiber( - boost::bind( join_interrupt_other, boost::ref( b) ) ).join(); + boost::bind( interrupt_join_fiber, b, value, interrupted) ).join(); } void test_join_runing() { - BOOST_CHECK_EQUAL( 0, value1); - BOOST_CHECK_EQUAL( 0, value2); + int value1 = 0; + int value2 = 0; + bool interrupted = false; boost::barrier b( 2); - boost::thread t1( boost::bind( fn_running, boost::ref( b) ) ); - boost::thread t2( boost::bind( fn_join, boost::ref( b) ) ); + boost::thread t1( boost::bind( fn_running, &b, &value1) ); + boost::thread t2( boost::bind( fn_join, &b, &value2, &interrupted) ); t1.join(); t2.join(); BOOST_CHECK_EQUAL( 6, value1); BOOST_CHECK_EQUAL( 7, value2); + BOOST_CHECK( ! interrupted); + delete other_f; +} + +void test_join_in_fiber_runing() +{ + int value1 = 0; + int value2 = 0; + bool interrupted = false; + + boost::barrier b( 2); + boost::thread t1( boost::bind( fn_running, &b, &value1) ); + boost::thread t2( boost::bind( fn_join_in_fiber, &b, &value2, &interrupted) ); + + t1.join(); + t2.join(); + + BOOST_CHECK_EQUAL( 6, value1); + BOOST_CHECK_EQUAL( 7, value2); + BOOST_CHECK( ! interrupted); delete other_f; } void test_join_terminated() { - value1 = 0; - value2 = 0; - BOOST_CHECK_EQUAL( 0, value1); - BOOST_CHECK_EQUAL( 0, value2); + int value1 = 0; + int value2 = 0; + bool interrupted = false; boost::barrier b( 2); - boost::thread t1( boost::bind( fn_terminated, boost::ref( b) ) ); - boost::thread t2( boost::bind( fn_join, boost::ref( b) ) ); + boost::thread t1( boost::bind( fn_terminated, &b, &value1) ); + boost::thread t2( boost::bind( fn_join, &b, &value2, &interrupted) ); t1.join(); t2.join(); BOOST_CHECK_EQUAL( 6, value1); BOOST_CHECK_EQUAL( 7, value2); + BOOST_CHECK( ! interrupted); + delete other_f; +} + +void test_join_in_fiber_terminated() +{ + int value1 = 0; + int value2 = 0; + bool interrupted = false; + + boost::barrier b( 2); + boost::thread t1( boost::bind( fn_terminated, &b, &value1) ); + boost::thread t2( boost::bind( fn_join_in_fiber, &b, &value2, &interrupted) ); + + t1.join(); + t2.join(); + + BOOST_CHECK_EQUAL( 6, value1); + BOOST_CHECK_EQUAL( 7, value2); + BOOST_CHECK( ! interrupted); delete other_f; } void test_join_interrupted_inside() { - for ( int i = 0; i < 1000; ++i) { - value1 = 0; - value2 = 0; - BOOST_CHECK_EQUAL( 0, value1); - BOOST_CHECK_EQUAL( 0, value2); + for ( int i = 0; i < 1; ++i) { + int value1 = 0; + int value2 = 0; + bool interrupted1 = false, interrupted2 = false; boost::barrier b( 2); - boost::thread t1( boost::bind( fn_interrupted_inside, boost::ref( b) ) ); - boost::thread t2( boost::bind( fn_join, boost::ref( b) ) ); - - t1.join(); - fprintf(stderr, "t1.joined\n"); - t2.join(); - - BOOST_CHECK_EQUAL( 6, value1); - BOOST_CHECK_EQUAL( 7, value2); - delete other_f; - } -} - -void test_join_interrupted_other() -{ - for ( int i = 0; i < 1000; ++i) { - value1 = 0; - value2 = 0; - BOOST_CHECK_EQUAL( 0, value1); - BOOST_CHECK_EQUAL( 0, value2); - - boost::barrier b( 2); - boost::thread t1( boost::bind( fn_running, boost::ref( b) ) ); - boost::thread t2( boost::bind( fn_join_interrupt, boost::ref( b) ) ); + boost::thread t1( boost::bind( fn_interrupt_from_same_thread, &b, &value1, &interrupted1) ); + boost::thread t2( boost::bind( fn_join, &b, &value2, &interrupted2) ); t1.join(); t2.join(); - BOOST_CHECK_EQUAL( 6, value1); - BOOST_CHECK_EQUAL( 7, value2); + BOOST_CHECK( interrupted1); + BOOST_CHECK( interrupted2); + BOOST_CHECK_EQUAL( 0, value2); delete other_f; } } @@ -217,12 +229,16 @@ boost::unit_test::test_suite * init_unit_test_suite( int, char* []) { boost::unit_test::test_suite * test = BOOST_TEST_SUITE("Boost.Fiber: round_robin test suite"); + #if 0 test->add( BOOST_TEST_CASE( & test_join_runing) ); - test->add( BOOST_TEST_CASE( & test_join_terminated) ); #endif + test->add( BOOST_TEST_CASE( & test_join_in_fiber_runing) ); +#if 0 + test->add( BOOST_TEST_CASE( & test_join_terminated) ); + test->add( BOOST_TEST_CASE( & test_join_in_fiber_runing) ); + test->add( BOOST_TEST_CASE( & test_join_in_fiber_terminated) ); test->add( BOOST_TEST_CASE( & test_join_interrupted_inside) ); - //test->add( BOOST_TEST_CASE( & test_join_interrupted_other) ); - +#endif return test; }