2
0
mirror of https://github.com/boostorg/fiber.git synced 2026-02-19 14:22:23 +00:00
Files
fiber/src/fiber_group.cpp
2013-10-28 14:53:48 +01:00

104 lines
1.9 KiB
C++

// Copyright Oliver Kowalke 2013.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include "boost/fiber/fiber_group.hpp"
#include <boost/foreach.hpp>
#include "boost/fiber/operations.hpp"
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace fibers {
fiber_group::~fiber_group()
{
BOOST_FOREACH( fiber * f, fibers_)
{ delete f; }
}
bool
fiber_group::is_this_fiber_in()
{
fiber::id id( this_fiber::get_id() );
mutex::scoped_lock lk( mtx_);
BOOST_FOREACH( fiber * f, fibers_)
{ if ( f->get_id() == id) return true; }
return false;
}
bool
fiber_group::is_fiber_in( fiber * f)
{
if ( ! f) return false;
fiber::id id( f->get_id() );
mutex::scoped_lock lk( mtx_);
BOOST_FOREACH( fiber * f, fibers_)
{ if ( f->get_id() == id) return true; }
return false;
}
void
fiber_group::add_fiber( fiber * f)
{
if ( ! f) return;
BOOST_ASSERT( ! is_fiber_in( f) );
mutex::scoped_lock lk( mtx_);
fibers_.push_back( f);
}
void
fiber_group::remove_fiber( fiber * f)
{
if ( ! f) return;
mutex::scoped_lock lk( mtx_);
std::vector< fiber * >::iterator i(
std::find( fibers_.begin(), fibers_.end(), f) );
if ( fibers_.end() != i) fibers_.erase( i);
}
void
fiber_group::join_all()
{
BOOST_ASSERT( ! is_this_fiber_in() );
mutex::scoped_lock lk( mtx_);
BOOST_FOREACH( fiber * f, fibers_)
{ if ( f->joinable() ) f->join(); }
}
void
fiber_group::interrupt_all()
{
mutex::scoped_lock lk( mtx_);
BOOST_FOREACH( fiber * f, fibers_)
{ f->interrupt(); }
}
std::size_t
fiber_group::size() const
{
mutex::scoped_lock lk( mtx_);
return fibers_.size();
}
}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX
#endif