Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r74450 - in trunk/boost/chrono: . detail/inlined/mac stopwatches
From: vicente.botet_at_[hidden]
Date: 2011-09-18 10:09:58


Author: viboes
Date: 2011-09-18 10:09:56 EDT (Sun, 18 Sep 2011)
New Revision: 74450
URL: http://svn.boost.org/trac/boost/changeset/74450

Log:
Chrono: fixed #5909: process_cpu_clock::now() on MAC gives time_points 1/1000 times + improve simple_stopwatch
Text files modified:
   trunk/boost/chrono/detail/inlined/mac/process_cpu_clocks.hpp | 27 ++++++++++++++-------------
   trunk/boost/chrono/process_cpu_clocks.hpp | 9 +++++++++
   trunk/boost/chrono/stopwatches/simple_stopwatch.hpp | 32 +++++++++++++++++++++++++++++---
   trunk/boost/chrono/system_clocks.hpp | 8 ++++----
   trunk/boost/chrono/thread_clock.hpp | 7 ++++---
   5 files changed, 60 insertions(+), 23 deletions(-)

Modified: trunk/boost/chrono/detail/inlined/mac/process_cpu_clocks.hpp
==============================================================================
--- trunk/boost/chrono/detail/inlined/mac/process_cpu_clocks.hpp (original)
+++ trunk/boost/chrono/detail/inlined/mac/process_cpu_clocks.hpp 2011-09-18 10:09:56 EDT (Sun, 18 Sep 2011)
@@ -33,7 +33,7 @@
             else
             {
                 BOOST_ASSERT( factor <= 1000000l ); // doesn't handle large ticks
- factor = 1000000l / factor; // compute factor
+ factor = 1000000000l / factor; // compute factor
                 if ( !factor ) factor = -1;
             }
         }
@@ -55,7 +55,7 @@
         if ( chrono_detail::tick_factor() != -1 )
         {
             return time_point(
- microseconds(c)*chrono_detail::tick_factor());
+ nanoseconds(c*chrono_detail::tick_factor()));
         }
         else
         {
@@ -96,7 +96,7 @@
                 ec.clear();
             }
             return time_point(
- microseconds(c)*chrono_detail::tick_factor());
+ nanoseconds(c*chrono_detail::tick_factor()));
         }
         else
         {
@@ -148,7 +148,7 @@
                 ec.clear();
             }
             return time_point(
- microseconds(tm.tms_utime + tm.tms_cutime)*chrono_detail::tick_factor());
+ nanoseconds((tm.tms_utime + tm.tms_cutime)*chrono_detail::tick_factor()));
         }
         else
         {
@@ -182,7 +182,7 @@
         if ( chrono_detail::tick_factor() != -1 )
         {
           return time_point(
- microseconds(tm.tms_utime + tm.tms_cutime)*chrono_detail::tick_factor());
+ nanoseconds((tm.tms_utime + tm.tms_cutime)*chrono_detail::tick_factor()));
         }
         else
         {
@@ -204,7 +204,7 @@
         if ( chrono_detail::tick_factor() != -1 )
         {
             return time_point(
- microseconds(tm.tms_stime + tm.tms_cstime)*chrono_detail::tick_factor());
+ nanoseconds((tm.tms_stime + tm.tms_cstime)*chrono_detail::tick_factor()));
         }
         else
         {
@@ -244,7 +244,7 @@
                 ec.clear();
             }
             return time_point(
- microseconds(tm.tms_stime + tm.tms_cstime)*chrono_detail::tick_factor());
+ nanoseconds((tm.tms_stime + tm.tms_cstime)*chrono_detail::tick_factor()));
         }
         else
         {
@@ -278,8 +278,8 @@
         if ( chrono_detail::tick_factor() != -1 )
         {
             time_point::rep r(
- c*chrono_detail::tick_factor(),
- (tm.tms_utime + tm.tms_cutime)*chrono_detail::tick_factor(),
+ c*chrono_detail::tick_factor(),
+ (tm.tms_utime + tm.tms_cutime)*chrono_detail::tick_factor(),
                     (tm.tms_stime + tm.tms_cstime)*chrono_detail::tick_factor());
             return time_point(duration(r));
         }
@@ -294,6 +294,7 @@
 process_cpu_clock::time_point process_cpu_clock::now(
         system::error_code & ec )
 {
+
     tms tm;
     clock_t c = ::times( &tm );
     if ( c == clock_t(-1) ) // error
@@ -316,10 +317,10 @@
     {
         if ( chrono_detail::tick_factor() != -1 )
         {
- time_point::rep r(
- c*chrono_detail::tick_factor(),
- (tm.tms_utime + tm.tms_cutime)*chrono_detail::tick_factor(),
- (tm.tms_stime + tm.tms_cstime)*chrono_detail::tick_factor());
+ time_point::rep r(
+ c*chrono_detail::tick_factor(),
+ (tm.tms_utime + tm.tms_cutime)*chrono_detail::tick_factor(),
+ (tm.tms_stime + tm.tms_cstime)*chrono_detail::tick_factor());
             return time_point(duration(r));
         }
         else

Modified: trunk/boost/chrono/process_cpu_clocks.hpp
==============================================================================
--- trunk/boost/chrono/process_cpu_clocks.hpp (original)
+++ trunk/boost/chrono/process_cpu_clocks.hpp 2011-09-18 10:09:56 EDT (Sun, 18 Sep 2011)
@@ -74,6 +74,11 @@
                 : real(0)
                 , user(0)
                 , system(0){}
+ explicit process_cpu_clock_times(
+ process_real_cpu_clock::rep r)
+ : real(r)
+ , user(0)
+ , system(0){}
             process_cpu_clock_times(
                 process_real_cpu_clock::rep r,
                 process_user_cpu_clock::rep u,
@@ -86,6 +91,10 @@
             process_user_cpu_clock::rep user; // user cpu time
             process_system_cpu_clock::rep system; // system cpu time
 
+ operator process_real_cpu_clock::rep()
+ {
+ return real;
+ }
             bool operator==(process_cpu_clock_times const& rhs) {
                 return (real==rhs.real &&
                         user==rhs.user &&

Modified: trunk/boost/chrono/stopwatches/simple_stopwatch.hpp
==============================================================================
--- trunk/boost/chrono/stopwatches/simple_stopwatch.hpp (original)
+++ trunk/boost/chrono/stopwatches/simple_stopwatch.hpp 2011-09-18 10:09:56 EDT (Sun, 18 Sep 2011)
@@ -11,6 +11,8 @@
 
 #include <boost/chrono/chrono.hpp>
 #include <boost/system/error_code.hpp>
+#include <boost/chrono/thread_clock.hpp>
+#include <boost/chrono/process_cpu_clocks.hpp>
 
 namespace boost
 {
@@ -18,7 +20,7 @@
   {
 
     /**
- * This class provides the simpler stopwath which is just able to give the elapsed time since its creation.
+ * This class provides the simpler stopwatch which is just able to give the elapsed time since its construction.
      */
     template<typename Clock=high_resolution_clock>
     class simple_stopwatch
@@ -32,7 +34,7 @@
       BOOST_CHRONO_STATIC_CONSTEXPR bool is_steady = Clock::is_steady;
 
 
- simple_stopwatch() :
+ simple_stopwatch() BOOST_CHRONO_NOEXCEPT :
         start_(clock::now())
       {
       }
@@ -50,7 +52,11 @@
         start_ = tmp;
       }
 
- duration elapsed()
+ ~simple_stopwatch() BOOST_CHRONO_NOEXCEPT
+ {
+ }
+
+ duration elapsed() BOOST_CHRONO_NOEXCEPT
       {
         return clock::now() - start_;
       }
@@ -67,8 +73,28 @@
 
     private:
       time_point start_;
+ simple_stopwatch(const simple_stopwatch&); // = delete;
+ simple_stopwatch& operator=(const simple_stopwatch&); // = delete;
     };
 
+ typedef simple_stopwatch<system_clock> system_simple_stopwatch;
+#ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
+ typedef simple_stopwatch<steady_clock> steady_simple_stopwatch;
+#endif
+ typedef simple_stopwatch<high_resolution_clock> high_resolution_simple_stopwatch;
+
+#if defined(BOOST_CHRONO_HAS_PROCESS_CLOCKS)
+ typedef simple_stopwatch<process_user_cpu_clock> process_user_cpu_simple_stopwatch;
+ typedef simple_stopwatch<process_system_cpu_clock> process_system_cpu_simple_stopwatch;
+ typedef simple_stopwatch<process_real_cpu_clock> process_real_cpu_simple_stopwatch;
+ typedef simple_stopwatch<process_cpu_clock> process_cpu_simple_stopwatch;
+#endif
+
+#if defined(BOOST_CHRONO_HAS_THREAD_CLOCK)
+ typedef simple_stopwatch<thread_clock> thread_simple_stopwatch;
+#endif
+
+
   } // namespace chrono
 } // namespace boost
 

Modified: trunk/boost/chrono/system_clocks.hpp
==============================================================================
--- trunk/boost/chrono/system_clocks.hpp (original)
+++ trunk/boost/chrono/system_clocks.hpp 2011-09-18 10:09:56 EDT (Sun, 18 Sep 2011)
@@ -127,8 +127,8 @@
       typedef chrono::time_point<system_clock> time_point;
       BOOST_CHRONO_STATIC_CONSTEXPR bool is_steady = false;
 
- static BOOST_CHRONO_INLINE time_point now() BOOST_CHRONO_NOEXCEPT; // throws on error
- static BOOST_CHRONO_INLINE time_point now(system::error_code & ec) ; // never throws
+ static BOOST_CHRONO_INLINE time_point now() BOOST_CHRONO_NOEXCEPT;
+ static BOOST_CHRONO_INLINE time_point now(system::error_code & ec);
 
       static BOOST_CHRONO_INLINE std::time_t to_time_t(const time_point& t) BOOST_CHRONO_NOEXCEPT;
       static BOOST_CHRONO_INLINE time_point from_time_t(std::time_t t) BOOST_CHRONO_NOEXCEPT;
@@ -151,8 +151,8 @@
       typedef chrono::time_point<steady_clock> time_point;
       BOOST_CHRONO_STATIC_CONSTEXPR bool is_steady = true;
 
- static BOOST_CHRONO_INLINE time_point now() BOOST_CHRONO_NOEXCEPT; // throws on error
- static BOOST_CHRONO_INLINE time_point now(system::error_code & ec) ; // never throws
+ static BOOST_CHRONO_INLINE time_point now() BOOST_CHRONO_NOEXCEPT;
+ static BOOST_CHRONO_INLINE time_point now(system::error_code & ec);
   };
 #endif
 //----------------------------------------------------------------------------//

Modified: trunk/boost/chrono/thread_clock.hpp
==============================================================================
--- trunk/boost/chrono/thread_clock.hpp (original)
+++ trunk/boost/chrono/thread_clock.hpp 2011-09-18 10:09:56 EDT (Sun, 18 Sep 2011)
@@ -10,6 +10,8 @@
 #ifndef BOOST_CHRONO_THREAD_CLOCK_HPP
 #define BOOST_CHRONO_THREAD_CLOCK_HPP
 
+#if defined(BOOST_CHRONO_HAS_THREAD_CLOCK)
+
 #include <boost/chrono/config.hpp>
 #include <boost/chrono/duration.hpp>
 #include <boost/chrono/time_point.hpp>
@@ -20,8 +22,6 @@
 #include <boost/config/abi_prefix.hpp> // must be the last #include
 #endif
 
-#if defined(BOOST_CHRONO_HAS_THREAD_CLOCK)
-
 namespace boost { namespace chrono {
 
 class BOOST_CHRONO_DECL thread_clock {
@@ -38,7 +38,6 @@
 } // namespace chrono
 } // namespace boost
 
-#endif
 
 #ifndef BOOST_CHRONO_HEADER_ONLY
 #include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
@@ -46,4 +45,6 @@
 #include <boost/chrono/detail/inlined/thread_clock.hpp>
 #endif
 
+#endif
+
 #endif // BOOST_CHRONO_THREAD_CLOCK_HPP


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