From 5f5a607d878dd414ece263e40528ca30932992ca Mon Sep 17 00:00:00 2001 From: Oliver Kowalke Date: Sun, 18 Oct 2015 09:08:15 +0200 Subject: [PATCH] request unwinding and resume fibers at end of dispatch() --- src/scheduler.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/scheduler.cpp b/src/scheduler.cpp index 1b5b0fae..0256049b 100644 --- a/src/scheduler.cpp +++ b/src/scheduler.cpp @@ -209,17 +209,25 @@ scheduler::dispatch() { release_terminated_(); // force unwinding of all context' in worker-queue worker_queue_t::iterator e = worker_queue_.end(); - for ( worker_queue_t::iterator i = worker_queue_.begin(); i != e; ++i) { - context * ctx = & ( * i); + for ( worker_queue_t::iterator i = worker_queue_.begin(); i != e;) { + context * ctx = & ( worker_queue_.front() ); BOOST_ASSERT( ! ctx->is_main_context() ); BOOST_ASSERT( ! ctx->is_dispatcher_context() ); if ( ctx->is_terminated() ) { i = worker_queue_.erase( i); } else { ctx->request_unwinding(); - set_ready( ctx); + set_ready( ctx); + ++i; } } + context * ctx = nullptr; + if ( nullptr != ( ctx = get_next_() ) ) { + // resume ready context's + sched_algo_->awakened( dispatcher_ctx_.get() ); + resume_( dispatcher_ctx_.get(), ctx, nullptr); + BOOST_ASSERT( context::active() == dispatcher_ctx_.get() ); + } } // release termianted context' release_terminated_();