From 95a6f0e91aacaaee3e2df36b21f53b48c96ca260 Mon Sep 17 00:00:00 2001 From: Oliver Kowalke Date: Sat, 24 Nov 2012 13:19:59 +0100 Subject: [PATCH] use scope-guard for changing active-fiber --- libs/fiber/src/detail/scheduler.cpp | 34 ++++++++++++++++------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/libs/fiber/src/detail/scheduler.cpp b/libs/fiber/src/detail/scheduler.cpp index add8d71d..13f27f94 100644 --- a/libs/fiber/src/detail/scheduler.cpp +++ b/libs/fiber/src/detail/scheduler.cpp @@ -6,6 +6,7 @@ #define BOOST_FIBERS_SOURCE #include +#include #include #include @@ -62,12 +63,12 @@ scheduler::spawn( fiber_base::ptr_t const& f) BOOST_ASSERT( ! f->is_complete() ); BOOST_ASSERT( f != active_fiber_); - // TODO: strong exception-safety must be guarantied - // use a guard for active_fiber_ fiber_base::ptr_t tmp = active_fiber_; + BOOST_SCOPE_EXIT( & tmp, & active_fiber_) { + active_fiber_ = tmp; + } BOOST_SCOPE_EXIT_END active_fiber_ = f; RESUME_FIBER( active_fiber_); - active_fiber_ = tmp; } void @@ -103,15 +104,17 @@ scheduler::cancel( fiber_base::ptr_t const& f) // ignore completed fiber if ( f->is_complete() ) return; - // TODO: strong exception-safety must be guarantied - // use a guard fiber_base::ptr_t tmp = active_fiber_; - active_fiber_ = f; - // terminate fiber means unwinding its stack - // so it becomes complete and joining fibers - // will be notified - active_fiber_->terminate(); - active_fiber_ = tmp; + { + BOOST_SCOPE_EXIT( & tmp, & active_fiber_) { + active_fiber_ = tmp; + } BOOST_SCOPE_EXIT_END + active_fiber_ = f; + // terminate fiber means unwinding its stack + // so it becomes complete and joining fibers + // will be notified + active_fiber_->terminate(); + } // erase completed fiber from waiting-queue f_idx_.erase( f); @@ -179,12 +182,13 @@ scheduler::run() BOOST_ASSERT( f_idx_.end() == f_idx_.find( f) ); } while ( f->is_complete() ); - // store previous active fiber - f.swap( active_fiber_); + fiber_base::ptr_t tmp = active_fiber_; + BOOST_SCOPE_EXIT( & tmp, & active_fiber_) { + active_fiber_ = tmp; + } BOOST_SCOPE_EXIT_END + active_fiber_ = f; // resume new active fiber RESUME_FIBER( active_fiber_); - // restore previous active fiber - f.swap( active_fiber_); return true; }