/usr/include/boost/fiber/detail
NameSizeModeActions
config.hpp18280644editdlrm
context_spinlock_queue.hpp26770644editdlrm
context_spmc_queue.hpp68480644editdlrm
convert.hpp10390644editdlrm
cpu_relax.hpp25540644editdlrm
data.hpp11320644editdlrm
decay_copy.hpp7330644editdlrm
disable_overload.hpp8020644editdlrm
exchange.hpp7340644editdlrm
fss.hpp13930644editdlrm
futex.hpp15560644editdlrm
is_all_same.hpp10220644editdlrm
rtm.hpp17910644editdlrm
spinlock.hpp21680644editdlrm
spinlock_rtm.hpp48450644editdlrm
spinlock_status.hpp4570644editdlrm
spinlock_ttas.hpp52680644editdlrm
spinlock_ttas_adaptive.hpp59440644editdlrm
spinlock_ttas_adaptive_futex.hpp66220644editdlrm
spinlock_ttas_futex.hpp58790644editdlrm
thread_barrier.hpp15400644editdlrm
Edit: /usr/include/boost/fiber/detail/thread_barrier.hpp (1540B)
// 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) #ifndef BOOST_FIBER_DETAIL_THREAD_BARRIER_H #define BOOST_FIBER_DETAIL_THREAD_BARRIER_H #include #include #include #include #include #include #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_PREFIX #endif namespace boost { namespace fibers { namespace detail { class thread_barrier { private: std::size_t initial_; std::size_t current_; bool cycle_{ true }; std::mutex mtx_{}; std::condition_variable cond_{}; public: explicit thread_barrier( std::size_t initial) : initial_{ initial }, current_{ initial_ } { BOOST_ASSERT ( 0 != initial); } thread_barrier( thread_barrier const&) = delete; thread_barrier & operator=( thread_barrier const&) = delete; bool wait() { std::unique_lock< std::mutex > lk( mtx_); const bool cycle = cycle_; if ( 0 == --current_) { cycle_ = ! cycle_; current_ = initial_; lk.unlock(); // no pessimization cond_.notify_all(); return true; } cond_.wait( lk, [&](){ return cycle != cycle_; }); return false; } }; }}} #endif // BOOST_FIBER_DETAIL_THREAD_BARRIER_H