Index: include/tbb/internal/_flow_graph_impl.h =================================================================== --- include/tbb/internal/_flow_graph_impl.h (revision 10741) +++ include/tbb/internal/_flow_graph_impl.h (working copy) @@ -518,8 +518,8 @@ // as above, but call try_put_task instead, and return the last task we received (if any) /*override*/ task * try_put_task( const T &t ) { task * last_task = NULL; - bool upgraded = false; - typename my_mutex_type::scoped_lock l(this->my_mutex, false); + bool upgraded = true; + typename my_mutex_type::scoped_lock l(this->my_mutex, upgraded); typename my_successors_type::iterator i = this->my_successors.begin(); while ( i != this->my_successors.end() ) { task *new_task = (*i)->try_put_task(t); @@ -560,8 +560,8 @@ } /*override*/task *try_put_task( const T &t ) { - bool upgraded = false; - typename my_mutex_type::scoped_lock l(this->my_mutex, false); + bool upgraded = true; + typename my_mutex_type::scoped_lock l(this->my_mutex, upgraded); typename my_successors_type::iterator i = this->my_successors.begin(); while ( i != this->my_successors.end() ) { task *new_task = (*i)->try_put_task(t); Index: include/tbb/flow_graph.h =================================================================== --- include/tbb/flow_graph.h (revision 10741) +++ include/tbb/flow_graph.h (working copy) @@ -1828,10 +1828,12 @@ } task *forward_task() { - spin_mutex::scoped_lock lock(my_mutex); - if ( my_count >= my_threshold ) - return NULL; - ++my_count; + { + spin_mutex::scoped_lock lock(my_mutex); + if ( my_count >= my_threshold ) + return NULL; + ++my_count; + } task * rtask = decrement_counter(); return rtask; }