Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // (C) Copyright 2011 Vicente J. Botet Escriba Chris@16: Chris@16: #ifndef BOOST_THREAD_V2_THREAD_HPP Chris@16: #define BOOST_THREAD_V2_THREAD_HPP Chris@16: Chris@16: #include Chris@16: #ifdef BOOST_THREAD_USES_CHRONO Chris@16: #include Chris@16: #include Chris@16: #endif Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace this_thread Chris@16: { Chris@101: namespace no_interruption_point Chris@101: { Chris@101: #ifdef BOOST_THREAD_USES_CHRONO Chris@16: Chris@101: template Chris@101: void sleep_until(const chrono::time_point& t) Chris@101: { Chris@101: using namespace chrono; Chris@101: mutex mut; Chris@101: condition_variable cv; Chris@101: unique_lock lk(mut); Chris@101: while (Clock::now() < t) Chris@101: cv.wait_until(lk, t); Chris@101: } Chris@101: Chris@101: #ifdef BOOST_THREAD_SLEEP_FOR_IS_STEADY Chris@101: Chris@101: template Chris@101: void sleep_for(const chrono::duration& d) Chris@101: { Chris@101: using namespace chrono; Chris@101: if (d > duration::zero()) Chris@101: { Chris@101: duration Max = nanoseconds::max BOOST_PREVENT_MACRO_SUBSTITUTION (); Chris@101: nanoseconds ns; Chris@101: if (d < Max) Chris@101: { Chris@101: ns = duration_cast(d); Chris@101: if (ns < d) Chris@101: ++ns; Chris@101: } Chris@101: else Chris@101: ns = nanoseconds:: max BOOST_PREVENT_MACRO_SUBSTITUTION (); Chris@101: sleep_for(ns); Chris@101: } Chris@101: } Chris@101: Chris@101: template Chris@101: inline BOOST_SYMBOL_VISIBLE Chris@101: void sleep_until(const chrono::time_point& t) Chris@101: { Chris@101: using namespace chrono; Chris@101: sleep_for(t - steady_clock::now()); Chris@101: } Chris@101: #else Chris@101: template Chris@101: void sleep_for(const chrono::duration& d) Chris@101: { Chris@101: using namespace chrono; Chris@101: if (d > duration::zero()) Chris@101: { Chris@101: steady_clock::time_point c_timeout = steady_clock::now() + ceil(d); Chris@101: sleep_until(c_timeout); Chris@101: } Chris@101: } Chris@101: Chris@101: #endif Chris@101: Chris@101: #endif Chris@101: } Chris@16: #ifdef BOOST_THREAD_USES_CHRONO Chris@16: Chris@16: template Chris@16: void sleep_until(const chrono::time_point& t) Chris@16: { Chris@16: using namespace chrono; Chris@16: mutex mut; Chris@16: condition_variable cv; Chris@16: unique_lock lk(mut); Chris@16: while (Clock::now() < t) Chris@16: cv.wait_until(lk, t); Chris@16: } Chris@16: Chris@16: #ifdef BOOST_THREAD_SLEEP_FOR_IS_STEADY Chris@16: Chris@16: template Chris@16: void sleep_for(const chrono::duration& d) Chris@16: { Chris@16: using namespace chrono; Chris@16: if (d > duration::zero()) Chris@16: { Chris@16: duration Max = nanoseconds::max BOOST_PREVENT_MACRO_SUBSTITUTION (); Chris@16: nanoseconds ns; Chris@16: if (d < Max) Chris@16: { Chris@16: ns = duration_cast(d); Chris@16: if (ns < d) Chris@16: ++ns; Chris@16: } Chris@16: else Chris@16: ns = nanoseconds:: max BOOST_PREVENT_MACRO_SUBSTITUTION (); Chris@16: sleep_for(ns); Chris@16: } Chris@16: } Chris@16: Chris@16: template Chris@16: inline BOOST_SYMBOL_VISIBLE Chris@16: void sleep_until(const chrono::time_point& t) Chris@16: { Chris@16: using namespace chrono; Chris@16: sleep_for(t - steady_clock::now()); Chris@16: } Chris@16: #else Chris@16: template Chris@16: void sleep_for(const chrono::duration& d) Chris@16: { Chris@16: using namespace chrono; Chris@16: if (d > duration::zero()) Chris@16: { Chris@16: steady_clock::time_point c_timeout = steady_clock::now() + ceil(d); Chris@16: sleep_until(c_timeout); Chris@16: } Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: #endif Chris@16: } Chris@16: } Chris@16: Chris@16: Chris@16: #endif