1 // win/chrono.cpp --------------------------------------------------------------//
3 // Copyright Beman Dawes 2008
4 // Copyright 2009-2010 Vicente J. Botet Escriba
6 // Distributed under the Boost Software License, Version 1.0.
7 // See http://www.boost.org/LICENSE_1_0.txt
9 //----------------------------------------------------------------------------//
11 //----------------------------------------------------------------------------//
12 #ifndef BOOST_CHRONO_DETAIL_INLINED_WIN_CHRONO_HPP
13 #define BOOST_CHRONO_DETAIL_INLINED_WIN_CHRONO_HPP
15 #include <boost/detail/winapi/time.hpp>
16 #include <boost/detail/winapi/timers.hpp>
17 #include <boost/detail/winapi/get_last_error.hpp>
18 #include <boost/assert.hpp>
24 namespace chrono_detail
27 BOOST_CHRONO_INLINE double get_nanosecs_per_tic() BOOST_NOEXCEPT
29 boost::detail::winapi::LARGE_INTEGER_ freq;
30 if ( !boost::detail::winapi::QueryPerformanceFrequency( &freq ) )
32 return double(1000000000.0L / freq.QuadPart);
37 steady_clock::time_point steady_clock::now() BOOST_NOEXCEPT
39 double nanosecs_per_tic = chrono_detail::get_nanosecs_per_tic();
41 boost::detail::winapi::LARGE_INTEGER_ pcount;
42 if ( nanosecs_per_tic <= 0.0L )
44 BOOST_ASSERT(0 && "Boost::Chrono - get_nanosecs_per_tic Internal Error");
45 return steady_clock::time_point();
48 while ( ! boost::detail::winapi::QueryPerformanceCounter( &pcount ) )
52 BOOST_ASSERT(0 && "Boost::Chrono - QueryPerformanceCounter Internal Error");
53 return steady_clock::time_point();
57 return steady_clock::time_point(steady_clock::duration(
58 static_cast<steady_clock::rep>((nanosecs_per_tic) * pcount.QuadPart)));
62 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
63 steady_clock::time_point steady_clock::now( system::error_code & ec )
65 double nanosecs_per_tic = chrono_detail::get_nanosecs_per_tic();
67 boost::detail::winapi::LARGE_INTEGER_ pcount;
68 if ( (nanosecs_per_tic <= 0.0L)
69 || (!boost::detail::winapi::QueryPerformanceCounter( &pcount )) )
71 boost::detail::winapi::DWORD_ cause =
72 ((nanosecs_per_tic <= 0.0L)
74 : boost::detail::winapi::GetLastError());
75 if (BOOST_CHRONO_IS_THROWS(ec)) {
76 boost::throw_exception(
79 BOOST_CHRONO_SYSTEM_CATEGORY,
80 "chrono::steady_clock" ));
84 ec.assign( cause, BOOST_CHRONO_SYSTEM_CATEGORY );
85 return steady_clock::time_point(duration(0));
89 if (!BOOST_CHRONO_IS_THROWS(ec))
93 return time_point(duration(
94 static_cast<steady_clock::rep>(nanosecs_per_tic * pcount.QuadPart)));
99 system_clock::time_point system_clock::now() BOOST_NOEXCEPT
101 boost::detail::winapi::FILETIME_ ft;
102 boost::detail::winapi::GetSystemTimeAsFileTime( &ft ); // never fails
103 return system_clock::time_point(
104 system_clock::duration(
105 ((static_cast<__int64>( ft.dwHighDateTime ) << 32) | ft.dwLowDateTime)
106 - 116444736000000000LL
107 //- (134775LL*864000000000LL)
112 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
114 system_clock::time_point system_clock::now( system::error_code & ec )
116 boost::detail::winapi::FILETIME_ ft;
117 boost::detail::winapi::GetSystemTimeAsFileTime( &ft ); // never fails
118 if (!BOOST_CHRONO_IS_THROWS(ec))
122 return system_clock::time_point(
123 system_clock::duration(
124 ((static_cast<__int64>( ft.dwHighDateTime ) << 32) | ft.dwLowDateTime)
125 - 116444736000000000LL
126 //- (134775LL*864000000000LL)
132 std::time_t system_clock::to_time_t(const system_clock::time_point& t) BOOST_NOEXCEPT
134 __int64 temp = t.time_since_epoch().count();
136 return static_cast<std::time_t>( temp );
140 system_clock::time_point system_clock::from_time_t(std::time_t t) BOOST_NOEXCEPT
144 return time_point(duration(temp));
147 } // namespace chrono