| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 | //          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_THIS_FIBER_OPERATIONS_H#define BOOST_THIS_FIBER_OPERATIONS_H#include <chrono>#include <boost/config.hpp> #include <boost/fiber/algo/algorithm.hpp>#include <boost/fiber/context.hpp>#include <boost/fiber/detail/config.hpp>#include <boost/fiber/detail/convert.hpp>#include <boost/fiber/fiber.hpp>#include <boost/fiber/scheduler.hpp>#ifdef BOOST_HAS_ABI_HEADERS#  include BOOST_ABI_PREFIX#endifnamespace boost {namespace this_fiber {inlinefibers::fiber::id get_id() noexcept {    return fibers::context::active()->get_id();}inlinevoid yield() noexcept {    fibers::context::active()->yield();}template< typename Clock, typename Duration >void sleep_until( std::chrono::time_point< Clock, Duration > const& sleep_time_) {    std::chrono::steady_clock::time_point sleep_time = boost::fibers::detail::convert( sleep_time_);    fibers::context * active_ctx = fibers::context::active();    active_ctx->twstatus.store( static_cast< std::intptr_t >( 0), std::memory_order_release);    active_ctx->wait_until( sleep_time);}template< typename Rep, typename Period >void sleep_for( std::chrono::duration< Rep, Period > const& timeout_duration) {    fibers::context * active_ctx = fibers::context::active();    active_ctx->twstatus.store( static_cast< std::intptr_t >( 0), std::memory_order_release);    active_ctx->wait_until( std::chrono::steady_clock::now() + timeout_duration);}template< typename PROPS >PROPS & properties() {    fibers::fiber_properties * props = fibers::context::active()->get_properties();    if ( BOOST_LIKELY( nullptr == props) ) {        // props could be nullptr if the thread's main fiber has not yet        // yielded (not yet passed through algorithm_with_properties::        // awakened()). Address that by yielding right now.        yield();        // Try again to obtain the fiber_properties subclass instance ptr.        // Walk through the whole chain again because who knows WHAT might        // have happened while we were yielding!        props = fibers::context::active()->get_properties();        // Could still be hosed if the running manager isn't a subclass of        // algorithm_with_properties.        BOOST_ASSERT_MSG( props, "this_fiber::properties not set");    }    return dynamic_cast< PROPS & >( * props );}}namespace fibers {inlinebool has_ready_fibers() noexcept {    return boost::fibers::context::active()->get_scheduler()->has_ready_fibers();}template< typename SchedAlgo, typename ... Args >void use_scheduling_algorithm( Args && ... args) noexcept {    boost::fibers::context::active()->get_scheduler()        ->set_algo( new SchedAlgo( std::forward< Args >( args) ... ) );}}}#ifdef BOOST_HAS_ABI_HEADERS#  include BOOST_ABI_SUFFIX#endif#endif // BOOST_THIS_FIBER_OPERATIONS_H
 |