1 // boost process_cpu_clocks.cpp -----------------------------------------------------------//
3 // Copyright Beman Dawes 1994, 2006, 2008
4 // Copyright Vicente J. Botet Escriba 2009
6 // Distributed under the Boost Software License, Version 1.0.
7 // See http://www.boost.org/LICENSE_1_0.txt
9 // See http://www.boost.org/libs/chrono for documentation.
11 //--------------------------------------------------------------------------------------//
13 #include <boost/chrono/config.hpp>
14 #include <boost/chrono/process_cpu_clocks.hpp>
15 #include <boost/assert.hpp>
17 #include <sys/times.h>
19 #include <time.h> // for clock_gettime
22 namespace boost { namespace chrono {
23 namespace chrono_detail
25 inline nanoseconds::rep tick_factor() // multiplier to convert ticks
26 // to nanoseconds; -1 if unknown
31 if ( (factor = ::sysconf( _SC_CLK_TCK )) <= 0 )
35 BOOST_ASSERT( factor <= 1000000000l ); // doesn't handle large ticks
36 factor = 1000000000l / factor; // compute factor
37 if ( !factor ) factor = -1;
44 process_real_cpu_clock::time_point process_real_cpu_clock::now() BOOST_NOEXCEPT
47 clock_t c = ::times( &tm );
48 if ( c == clock_t(-1) ) // error
50 BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
54 if ( chrono_detail::tick_factor() != -1 )
57 nanoseconds(c*chrono_detail::tick_factor()));
61 BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
67 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
68 process_real_cpu_clock::time_point process_real_cpu_clock::now(
69 system::error_code & ec)
73 clock_t c = ::times( &tm );
74 if ( c == clock_t(-1) ) // error
76 if (BOOST_CHRONO_IS_THROWS(ec))
78 boost::throw_exception(
81 BOOST_CHRONO_SYSTEM_CATEGORY,
82 "chrono::process_real_cpu_clock" ));
86 ec.assign( errno, BOOST_CHRONO_SYSTEM_CATEGORY );
92 if ( chrono_detail::tick_factor() != -1 )
94 if (!BOOST_CHRONO_IS_THROWS(ec))
99 nanoseconds(c*chrono_detail::tick_factor()));
103 if (BOOST_CHRONO_IS_THROWS(ec))
105 boost::throw_exception(
106 system::system_error(
108 BOOST_CHRONO_SYSTEM_CATEGORY,
109 "chrono::process_real_cpu_clock" ));
113 ec.assign( errno, BOOST_CHRONO_SYSTEM_CATEGORY );
121 process_user_cpu_clock::time_point process_user_cpu_clock::now() BOOST_NOEXCEPT
124 clock_t c = ::times( &tm );
125 if ( c == clock_t(-1) ) // error
127 BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
131 if ( chrono_detail::tick_factor() != -1 )
134 nanoseconds((tm.tms_utime + tm.tms_cutime)*chrono_detail::tick_factor()));
138 BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
144 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
145 process_user_cpu_clock::time_point process_user_cpu_clock::now(
146 system::error_code & ec)
149 clock_t c = ::times( &tm );
150 if ( c == clock_t(-1) ) // error
152 if (BOOST_CHRONO_IS_THROWS(ec))
154 boost::throw_exception(
155 system::system_error(
157 BOOST_CHRONO_SYSTEM_CATEGORY,
158 "chrono::process_user_cpu_clock" ));
162 ec.assign( errno, BOOST_CHRONO_SYSTEM_CATEGORY );
168 if ( chrono_detail::tick_factor() != -1 )
170 if (!BOOST_CHRONO_IS_THROWS(ec))
175 nanoseconds((tm.tms_utime + tm.tms_cutime)*chrono_detail::tick_factor()));
179 if (BOOST_CHRONO_IS_THROWS(ec))
181 boost::throw_exception(
182 system::system_error(
184 BOOST_CHRONO_SYSTEM_CATEGORY,
185 "chrono::process_user_cpu_clock" ));
189 ec.assign( errno, BOOST_CHRONO_SYSTEM_CATEGORY );
197 process_system_cpu_clock::time_point process_system_cpu_clock::now() BOOST_NOEXCEPT
200 clock_t c = ::times( &tm );
201 if ( c == clock_t(-1) ) // error
203 BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
208 if ( chrono_detail::tick_factor() != -1 )
211 nanoseconds((tm.tms_stime + tm.tms_cstime)*chrono_detail::tick_factor()));
215 BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
221 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
222 process_system_cpu_clock::time_point process_system_cpu_clock::now(
223 system::error_code & ec)
226 clock_t c = ::times( &tm );
227 if ( c == clock_t(-1) ) // error
229 if (BOOST_CHRONO_IS_THROWS(ec))
231 boost::throw_exception(
232 system::system_error(
234 BOOST_CHRONO_SYSTEM_CATEGORY,
235 "chrono::process_system_cpu_clock" ));
239 ec.assign( errno, BOOST_CHRONO_SYSTEM_CATEGORY );
245 if ( chrono_detail::tick_factor() != -1 )
247 if (!BOOST_CHRONO_IS_THROWS(ec))
252 nanoseconds((tm.tms_stime + tm.tms_cstime)*chrono_detail::tick_factor()));
256 if (BOOST_CHRONO_IS_THROWS(ec))
258 boost::throw_exception(
259 system::system_error(
261 BOOST_CHRONO_SYSTEM_CATEGORY,
262 "chrono::process_system_cpu_clock" ));
266 ec.assign( errno, BOOST_CHRONO_SYSTEM_CATEGORY );
274 process_cpu_clock::time_point process_cpu_clock::now() BOOST_NOEXCEPT
277 clock_t c = ::times( &tm );
278 if ( c == clock_t(-1) ) // error
280 BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
284 nanoseconds::rep factor = chrono_detail::tick_factor();
289 (tm.tms_utime + tm.tms_cutime)*factor,
290 (tm.tms_stime + tm.tms_cstime)*factor);
291 return time_point(duration(r));
295 BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
301 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
302 process_cpu_clock::time_point process_cpu_clock::now(
303 system::error_code & ec )
306 clock_t c = ::times( &tm );
307 if ( c == clock_t(-1) ) // error
309 if (BOOST_CHRONO_IS_THROWS(ec))
311 boost::throw_exception(
312 system::system_error(
314 BOOST_CHRONO_SYSTEM_CATEGORY,
315 "chrono::process_clock" ));
319 ec.assign( errno, BOOST_CHRONO_SYSTEM_CATEGORY );
325 if ( chrono_detail::tick_factor() != -1 )
328 c*chrono_detail::tick_factor(),
329 (tm.tms_utime + tm.tms_cutime)*chrono_detail::tick_factor(),
330 (tm.tms_stime + tm.tms_cstime)*chrono_detail::tick_factor());
331 return time_point(duration(r));
335 if (BOOST_CHRONO_IS_THROWS(ec))
337 boost::throw_exception(
338 system::system_error(
340 BOOST_CHRONO_SYSTEM_CATEGORY,
341 "chrono::process_clock" ));
345 ec.assign( errno, BOOST_CHRONO_SYSTEM_CATEGORY );