$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r58016 - in sandbox/fiber: boost/fiber libs/fiber/doc libs/fiber/src
From: oliver.kowalke_at_[hidden]
Date: 2009-11-28 15:38:09
Author: olli
Date: 2009-11-28 15:38:08 EST (Sat, 28 Nov 2009)
New Revision: 58016
URL: http://svn.boost.org/trac/boost/changeset/58016
Log:
- add detach() to strategy
- detach all remaining fibers in the destructor of round_robin
Text files modified: 
   sandbox/fiber/boost/fiber/round_robin.hpp    |     2 ++                                      
   sandbox/fiber/boost/fiber/strategy.hpp       |     2 ++                                      
   sandbox/fiber/libs/fiber/doc/fiber_ref.qbk   |    13 +++++++++++++                           
   sandbox/fiber/libs/fiber/src/round_robin.cpp |     6 ++++++                                  
   sandbox/fiber/libs/fiber/src/strategy.cpp    |     6 ++++++                                  
   5 files changed, 29 insertions(+), 0 deletions(-)
Modified: sandbox/fiber/boost/fiber/round_robin.hpp
==============================================================================
--- sandbox/fiber/boost/fiber/round_robin.hpp	(original)
+++ sandbox/fiber/boost/fiber/round_robin.hpp	2009-11-28 15:38:08 EST (Sat, 28 Nov 2009)
@@ -61,6 +61,8 @@
 public:
         round_robin();
 
+	~round_robin();
+
         void add( fiber);
 
         void yield( fiber::id const&);
Modified: sandbox/fiber/boost/fiber/strategy.hpp
==============================================================================
--- sandbox/fiber/boost/fiber/strategy.hpp	(original)
+++ sandbox/fiber/boost/fiber/strategy.hpp	2009-11-28 15:38:08 EST (Sat, 28 Nov 2009)
@@ -98,6 +98,8 @@
 
         void attach( fiber &);
 
+	void detach( fiber &);
+
         void switch_between( fiber &, fiber &);
 
         void enable_interruption( fiber &);
Modified: sandbox/fiber/libs/fiber/doc/fiber_ref.qbk
==============================================================================
--- sandbox/fiber/libs/fiber/doc/fiber_ref.qbk	(original)
+++ sandbox/fiber/libs/fiber/doc/fiber_ref.qbk	2009-11-28 15:38:08 EST (Sat, 28 Nov 2009)
@@ -945,6 +945,7 @@
                 fiber					master_fiber;
 
                 void attach( fiber &);
+		void detach( fiber &);
 
                 void switch_between( fiber &, fiber &);
 
@@ -1001,6 +1002,18 @@
 [endsect]
 
 
+[section:detach Protected member function `detach( fiber &)`]
+
+        void detach( fiber &);
+
+[variablelist
+[[Effects:] [Protected member function in order to unregister the scheduler in
+internal storage from the fiber.]]
+[[Throws:] [Nothing.]]
+]
+[endsect]
+
+
 [section:switch_between Protected member function `switch_between( fiber &, fiber &)`]
 
         void switch_between( fiber & from, fiber & to);
Modified: sandbox/fiber/libs/fiber/src/round_robin.cpp
==============================================================================
--- sandbox/fiber/libs/fiber/src/round_robin.cpp	(original)
+++ sandbox/fiber/libs/fiber/src/round_robin.cpp	2009-11-28 15:38:08 EST (Sat, 28 Nov 2009)
@@ -27,6 +27,12 @@
         terminated_fibers_()
 {}
 
+round_robin::~round_robin()
+{
+	BOOST_FOREACH( container::value_type va, fibers_)
+	{ detach( va.second.f); }
+}
+
 void
 round_robin::add( fiber f)
 {
Modified: sandbox/fiber/libs/fiber/src/strategy.cpp
==============================================================================
--- sandbox/fiber/libs/fiber/src/strategy.cpp	(original)
+++ sandbox/fiber/libs/fiber/src/strategy.cpp	2009-11-28 15:38:08 EST (Sat, 28 Nov 2009)
@@ -85,6 +85,7 @@
 {
         fiber * active( active_fiber.get() );
         if ( ! active) throw fiber_error("not a fiber");
+	if ( ! active->info_()->st) throw scheduler_error("no valid scheduler");
         active->info_()->st->yield( active->get_id() );
 }
 
@@ -93,6 +94,7 @@
 {
         fiber * active( active_fiber.get() );
         if ( ! active) throw fiber_error("not a fiber");
+	if ( ! active->info_()->st) throw scheduler_error("no valid scheduler");
         active->info_()->st->cancel( active->get_id() );
 }
 
@@ -113,6 +115,10 @@
 { f.info_()->st = this; }
 
 void
+strategy::detach( fiber & f)
+{ f.info_()->st = 0; }
+
+void
 strategy::switch_between( fiber & from, fiber & to)
 { from.switch_to_( to); }