From f306dcc391f33197b9ffd4ece11ec950be1c349b Mon Sep 17 00:00:00 2001 From: Oliver Kowalke Date: Sat, 15 Dec 2012 14:36:39 +0100 Subject: [PATCH] scheduler::swap() --- include/boost/fiber/scheduler.hpp | 2 ++ src/scheduler.cpp | 6 ++++++ test/test_fiber.cpp | 12 ++++++++++++ 3 files changed, 20 insertions(+) diff --git a/include/boost/fiber/scheduler.hpp b/include/boost/fiber/scheduler.hpp index 239abaeb..28a98deb 100644 --- a/include/boost/fiber/scheduler.hpp +++ b/include/boost/fiber/scheduler.hpp @@ -100,6 +100,8 @@ private: public: static scheduler & instance(); + static void swap( scheduler *) BOOST_NOEXCEPT; + virtual void spawn( detail::fiber_base::ptr_t const&) = 0; virtual void join( detail::fiber_base::ptr_t const&) = 0; diff --git a/src/scheduler.cpp b/src/scheduler.cpp index adac06a1..95b28fd4 100644 --- a/src/scheduler.cpp +++ b/src/scheduler.cpp @@ -5,6 +5,8 @@ #define BOOST_FIBERS_SOURCE +#include + #include #include @@ -32,6 +34,10 @@ scheduler::instance() return * instance_; } +void +scheduler::swap( scheduler * sched) +{ std::swap( instance_, sched); } + }} #ifdef BOOST_HAS_ABI_HEADERS diff --git a/test/test_fiber.cpp b/test/test_fiber.cpp index c6ea83e0..16c2bf01 100644 --- a/test/test_fiber.cpp +++ b/test/test_fiber.cpp @@ -14,6 +14,7 @@ #include #include +#include namespace stm = boost::fibers; namespace this_stm = boost::this_fiber; @@ -180,6 +181,16 @@ void test_detach() BOOST_CHECK( ! s2); } +void test_swap() +{ + stm::scheduler::swap( + new stm::detail::default_scheduler() ); + stm::fiber s1( f1); + BOOST_CHECK( ! s1); + stm::fiber s2( f2); + BOOST_CHECK( s2); +} + void test_complete() { stm::fiber s1( f1); @@ -330,6 +341,7 @@ boost::unit_test::test_suite * init_unit_test_suite( int, char* []) test->add( BOOST_TEST_CASE( & test_id) ); test->add( BOOST_TEST_CASE( & test_detach) ); test->add( BOOST_TEST_CASE( & test_complete) ); + test->add( BOOST_TEST_CASE( & test_swap) ); test->add( BOOST_TEST_CASE( & test_cancel) ); test->add( BOOST_TEST_CASE( & test_join) ); test->add( BOOST_TEST_CASE( & test_yield_break) );