$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r58339 - in sandbox/fiber: boost/fiber libs/fiber/test
From: oliver.kowalke_at_[hidden]
Date: 2009-12-13 04:54:08
Author: olli
Date: 2009-12-13 04:54:07 EST (Sun, 13 Dec 2009)
New Revision: 58339
URL: http://svn.boost.org/trac/boost/changeset/58339
Log:
- migrate overloaded for passing only the fiber
Text files modified: 
   sandbox/fiber/boost/fiber/fiber.hpp              |     4 ++                                      
   sandbox/fiber/boost/fiber/scheduler.hpp          |    10 ++++++                                  
   sandbox/fiber/libs/fiber/test/test_scheduler.cpp |    64 ++++++++++++++++++++++++++++++++++++++++
   3 files changed, 78 insertions(+), 0 deletions(-)
Modified: sandbox/fiber/boost/fiber/fiber.hpp
==============================================================================
--- sandbox/fiber/boost/fiber/fiber.hpp	(original)
+++ sandbox/fiber/boost/fiber/fiber.hpp	2009-12-13 04:54:07 EST (Sun, 13 Dec 2009)
@@ -33,11 +33,15 @@
 
 #define BOOST_FIBER_DEFAULT_STACKSIZE 64000
 
+template< typename Strategy >
+class scheduler;
 class strategy;
 
 class BOOST_FIBER_DECL fiber
 {
 private:
+	template< typename Strategy >
+	friend class scheduler;
         friend class strategy;
 
         struct dummy;
Modified: sandbox/fiber/boost/fiber/scheduler.hpp
==============================================================================
--- sandbox/fiber/boost/fiber/scheduler.hpp	(original)
+++ sandbox/fiber/boost/fiber/scheduler.hpp	2009-12-13 04:54:07 EST (Sun, 13 Dec 2009)
@@ -15,6 +15,7 @@
 #include <boost/utility.hpp>
 
 #include <boost/fiber/detail/config.hpp>
+#include <boost/fiber/exceptions.hpp>
 #include <boost/fiber/fiber.hpp>
 #include <boost/fiber/round_robin.hpp>
 #include <boost/fiber/strategy.hpp>
@@ -77,6 +78,15 @@
         void make_fiber( std::size_t stack_size, Fn fn)
         { strategy_->add( fiber( stack_size, fn) ); }
 
+	void migrate_fiber( fiber f)
+	{
+		if ( ! f) throw fiber_moved();
+
+		strategy * st( f.info_()->st);
+		if ( ! st) throw fiber_error("fiber not attached");
+		strategy_->migrate( f.info_()->st->release( f.get_id() ) );
+	}
+
         template< typename OtherStrategy >
         void migrate_fiber( fiber::id const& id, scheduler< OtherStrategy > & other)
         { strategy_->migrate( other.strategy_->release( id) ); }
Modified: sandbox/fiber/libs/fiber/test/test_scheduler.cpp
==============================================================================
--- sandbox/fiber/libs/fiber/test/test_scheduler.cpp	(original)
+++ sandbox/fiber/libs/fiber/test/test_scheduler.cpp	2009-12-13 04:54:07 EST (Sun, 13 Dec 2009)
@@ -343,6 +343,69 @@
         BOOST_CHECK_EQUAL( 3, value2);
 }
 
+void test_case_7()
+{
+	value1 = 0;
+	value2 = 0;
+
+	boost::fibers::scheduler<> sched1, sched2;
+
+	boost::fiber f( & yield1_fn); 
+	boost::fiber::id id = f.get_id();
+	sched1.submit_fiber( f);
+	sched2.make_fiber( & yield2_fn);
+
+	BOOST_CHECK( ! sched1.empty() );
+	BOOST_CHECK( ! sched2.empty() );
+	BOOST_CHECK_EQUAL( std::size_t( 1), sched1.size() );
+	BOOST_CHECK_EQUAL( std::size_t( 1), sched2.size() );
+	BOOST_CHECK_EQUAL( 0, value1);
+	BOOST_CHECK_EQUAL( 0, value2);
+
+	BOOST_CHECK( sched1.run() );
+	BOOST_CHECK( ! sched1.empty() );
+	BOOST_CHECK_EQUAL( std::size_t( 1), sched1.size() );
+	BOOST_CHECK_EQUAL( 1, value1);	
+	BOOST_CHECK_EQUAL( 0, value2);
+
+	BOOST_CHECK( sched2.run() );
+	BOOST_CHECK( ! sched2.empty() );
+	BOOST_CHECK_EQUAL( std::size_t( 1), sched2.size() );
+	BOOST_CHECK_EQUAL( 1, value1);	
+	BOOST_CHECK_EQUAL( 1, value2);
+
+	BOOST_CHECK( sched1.run() );
+	BOOST_CHECK( ! sched1.empty() );
+	BOOST_CHECK_EQUAL( std::size_t( 1), sched1.size() );
+	BOOST_CHECK_EQUAL( 2, value1);	
+	BOOST_CHECK_EQUAL( 1, value2);
+
+	BOOST_CHECK( sched2.run() );
+	BOOST_CHECK( ! sched2.empty() );
+	BOOST_CHECK_EQUAL( std::size_t( 1), sched2.size() );
+	BOOST_CHECK_EQUAL( 2, value1);	
+	BOOST_CHECK_EQUAL( 2, value2);
+
+	sched2.migrate_fiber( f);
+	BOOST_CHECK_EQUAL( std::size_t( 0), sched1.size() );
+	BOOST_CHECK_EQUAL( std::size_t( 2), sched2.size() );
+
+	BOOST_CHECK( ! sched1.run() );
+	BOOST_CHECK( sched1.empty() );
+
+	BOOST_CHECK( sched2.run() );
+	BOOST_CHECK( ! sched2.empty() );
+	BOOST_CHECK_EQUAL( std::size_t( 2), sched2.size() );
+	BOOST_CHECK_EQUAL( 2, value1);	
+	BOOST_CHECK_EQUAL( 3, value2);
+
+	BOOST_CHECK( sched2.run() );
+	BOOST_CHECK( ! sched2.empty() );
+	BOOST_CHECK_EQUAL( std::size_t( 2), sched2.size() );
+	BOOST_CHECK_EQUAL( 3, value1);	
+	BOOST_CHECK_EQUAL( 3, value2);
+}
+
 boost::unit_test::test_suite * init_unit_test_suite( int, char* [])
 {
         boost::unit_test::test_suite * test =
@@ -354,6 +417,7 @@
         test->add( BOOST_TEST_CASE( & test_case_4) );
         test->add( BOOST_TEST_CASE( & test_case_5) );
         test->add( BOOST_TEST_CASE( & test_case_6) );
+	test->add( BOOST_TEST_CASE( & test_case_7) );
 
         return test;
 }