Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r81649 - in trunk/boost/thread: detail pthread v2
From: vicente.botet_at_[hidden]
Date: 2012-12-01 06:12:02


Author: viboes
Date: 2012-12-01 06:12:01 EST (Sat, 01 Dec 2012)
New Revision: 81649
URL: http://svn.boost.org/trac/boost/changeset/81649

Log:
Thread: update sleep_for algo depending on whether BOOST_THREAD_SLEEP_FOR_IS_STEADY is defined or not
Text files modified:
   trunk/boost/thread/detail/config.hpp | 7 +++++
   trunk/boost/thread/pthread/thread_data.hpp | 5 +++
   trunk/boost/thread/v2/thread.hpp | 48 ++++++++++++++++++++++++++++++++-------
   3 files changed, 50 insertions(+), 10 deletions(-)

Modified: trunk/boost/thread/detail/config.hpp
==============================================================================
--- trunk/boost/thread/detail/config.hpp (original)
+++ trunk/boost/thread/detail/config.hpp 2012-12-01 06:12:01 EST (Sat, 01 Dec 2012)
@@ -281,6 +281,13 @@
 
 #include <boost/thread/detail/platform.hpp>
 
+#if defined(BOOST_THREAD_PLATFORM_WIN32)
+#else
+ # if defined(BOOST_HAS_PTHREAD_DELAY_NP) || defined(BOOST_HAS_NANOSLEEP)
+ # define BOOST_THREAD_SLEEP_FOR_IS_STEADY
+ # endif
+#endif
+
 // provided for backwards compatibility, since this
 // macro was used for several releases by mistake.
 #if defined(BOOST_THREAD_DYN_DLL) && ! defined BOOST_THREAD_DYN_LINK

Modified: trunk/boost/thread/pthread/thread_data.hpp
==============================================================================
--- trunk/boost/thread/pthread/thread_data.hpp (original)
+++ trunk/boost/thread/pthread/thread_data.hpp 2012-12-01 06:12:01 EST (Sat, 01 Dec 2012)
@@ -143,7 +143,7 @@
             typedef pthread_t native_handle_type;
 
             virtual void run()=0;
- void notify_all_at_thread_exit(condition_variable* cv, mutex* m)
+ virtual void notify_all_at_thread_exit(condition_variable* cv, mutex* m)
             {
               notify.push_back(std::pair<condition_variable*, mutex*>(cv, m));
             }
@@ -221,11 +221,14 @@
       }
 
 #ifdef BOOST_THREAD_USES_CHRONO
+#ifdef BOOST_THREAD_SLEEP_FOR_IS_STEADY
+
         inline
         void BOOST_SYMBOL_VISIBLE sleep_for(const chrono::nanoseconds& ns)
         {
             return boost::this_thread::hiden::sleep_for(boost::detail::to_timespec(ns));
         }
+#endif
 #endif // BOOST_THREAD_USES_CHRONO
 
         void BOOST_THREAD_DECL yield() BOOST_NOEXCEPT;

Modified: trunk/boost/thread/v2/thread.hpp
==============================================================================
--- trunk/boost/thread/v2/thread.hpp (original)
+++ trunk/boost/thread/v2/thread.hpp 2012-12-01 06:12:01 EST (Sat, 01 Dec 2012)
@@ -9,6 +9,7 @@
 #include <boost/thread/detail/config.hpp>
 #ifdef BOOST_THREAD_USES_CHRONO
 #include <boost/chrono/system_clocks.hpp>
+#include <boost/chrono/ceil.hpp>
 #endif
 #include <boost/thread/condition_variable.hpp>
 #include <boost/thread/lock_types.hpp>
@@ -20,15 +21,6 @@
 
 #ifdef BOOST_THREAD_USES_CHRONO
 
- template <class Rep, class Period>
- void sleep_for(const chrono::duration<Rep, Period>& d)
- {
- using namespace chrono;
- nanoseconds ns = duration_cast<nanoseconds> (d);
- if (ns < d) ++ns;
- sleep_for(ns);
- }
-
     template <class Clock, class Duration>
     void sleep_until(const chrono::time_point<Clock, Duration>& t)
     {
@@ -40,6 +32,28 @@
         cv.wait_until(lk, t);
     }
 
+#ifdef BOOST_THREAD_SLEEP_FOR_IS_STEADY
+
+ template <class Rep, class Period>
+ void sleep_for(const chrono::duration<Rep, Period>& d)
+ {
+ using namespace chrono;
+ if (d > duration<Rep, Period>::zero())
+ {
+ duration<long double> Max = nanoseconds::max();
+ nanoseconds ns;
+ if (d < Max)
+ {
+ ns = duration_cast<nanoseconds>(d);
+ if (ns < d)
+ ++ns;
+ }
+ else
+ ns = nanoseconds::max();
+ sleep_for(ns);
+ }
+ }
+
     template <class Duration>
     inline BOOST_SYMBOL_VISIBLE
     void sleep_until(const chrono::time_point<chrono::steady_clock, Duration>& t)
@@ -47,6 +61,22 @@
       using namespace chrono;
       sleep_for(t - steady_clock::now());
     }
+#else
+ template <class Rep, class Period>
+ void sleep_for(const chrono::duration<Rep, Period>& d)
+ {
+ using namespace chrono;
+ if (d > duration<Rep, Period>::zero())
+ {
+ steady_clock::time_point c_now = steady_clock::now();
+ do
+ {
+ sleep_until(system_clock::now() + ceil<nanoseconds>(d));
+ } while (steady_clock::now() - c_now < d );
+ }
+ }
+
+#endif
 
 #endif
   }


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk