Chris@16
|
1 // boost thread_clock.cpp -----------------------------------------------------------//
|
Chris@16
|
2
|
Chris@16
|
3 // Copyright 2010 Vicente J. Botet Escriba
|
Chris@16
|
4
|
Chris@16
|
5 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
6 // See http://www.boost.org/LICENSE_1_0.txt
|
Chris@16
|
7
|
Chris@16
|
8 // See http://www.boost.org/libs/chrono for documentation.
|
Chris@16
|
9
|
Chris@16
|
10 //--------------------------------------------------------------------------------------//
|
Chris@16
|
11 #ifndef BOOST_CHRONO_DETAIL_INLINED_WIN_THREAD_CLOCK_HPP
|
Chris@16
|
12 #define BOOST_CHRONO_DETAIL_INLINED_WIN_THREAD_CLOCK_HPP
|
Chris@16
|
13
|
Chris@16
|
14 #include <boost/chrono/config.hpp>
|
Chris@16
|
15 #include <boost/chrono/thread_clock.hpp>
|
Chris@16
|
16 #include <cassert>
|
Chris@16
|
17
|
Chris@16
|
18 #include <boost/detail/winapi/GetLastError.hpp>
|
Chris@16
|
19 #include <boost/detail/winapi/GetCurrentThread.hpp>
|
Chris@16
|
20 #include <boost/detail/winapi/GetThreadTimes.hpp>
|
Chris@16
|
21
|
Chris@16
|
22 namespace boost
|
Chris@16
|
23 {
|
Chris@16
|
24 namespace chrono
|
Chris@16
|
25 {
|
Chris@16
|
26
|
Chris@16
|
27 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
|
Chris@16
|
28 thread_clock::time_point thread_clock::now( system::error_code & ec )
|
Chris@16
|
29 {
|
Chris@16
|
30 // note that Windows uses 100 nanosecond ticks for FILETIME
|
Chris@16
|
31 boost::detail::winapi::FILETIME_ creation, exit, user_time, system_time;
|
Chris@16
|
32
|
Chris@16
|
33 if ( boost::detail::winapi::GetThreadTimes(
|
Chris@16
|
34 boost::detail::winapi::GetCurrentThread (), &creation, &exit,
|
Chris@16
|
35 &system_time, &user_time ) )
|
Chris@16
|
36 {
|
Chris@16
|
37 duration user = duration(
|
Chris@16
|
38 ((static_cast<duration::rep>(user_time.dwHighDateTime) << 32)
|
Chris@16
|
39 | user_time.dwLowDateTime) * 100 );
|
Chris@16
|
40
|
Chris@16
|
41 duration system = duration(
|
Chris@16
|
42 ((static_cast<duration::rep>(system_time.dwHighDateTime) << 32)
|
Chris@16
|
43 | system_time.dwLowDateTime) * 100 );
|
Chris@16
|
44
|
Chris@16
|
45 if (!BOOST_CHRONO_IS_THROWS(ec))
|
Chris@16
|
46 {
|
Chris@16
|
47 ec.clear();
|
Chris@16
|
48 }
|
Chris@16
|
49 return time_point(system+user);
|
Chris@16
|
50
|
Chris@16
|
51 }
|
Chris@16
|
52 else
|
Chris@16
|
53 {
|
Chris@16
|
54 if (BOOST_CHRONO_IS_THROWS(ec))
|
Chris@16
|
55 {
|
Chris@16
|
56 boost::throw_exception(
|
Chris@16
|
57 system::system_error(
|
Chris@16
|
58 boost::detail::winapi::GetLastError(),
|
Chris@16
|
59 BOOST_CHRONO_SYSTEM_CATEGORY,
|
Chris@16
|
60 "chrono::thread_clock" ));
|
Chris@16
|
61 }
|
Chris@16
|
62 else
|
Chris@16
|
63 {
|
Chris@16
|
64 ec.assign( boost::detail::winapi::GetLastError(), BOOST_CHRONO_SYSTEM_CATEGORY );
|
Chris@16
|
65 return thread_clock::time_point(duration(0));
|
Chris@16
|
66 }
|
Chris@16
|
67 }
|
Chris@16
|
68 }
|
Chris@16
|
69 #endif
|
Chris@16
|
70
|
Chris@16
|
71 thread_clock::time_point thread_clock::now() BOOST_NOEXCEPT
|
Chris@16
|
72 {
|
Chris@16
|
73
|
Chris@16
|
74 // note that Windows uses 100 nanosecond ticks for FILETIME
|
Chris@16
|
75 boost::detail::winapi::FILETIME_ creation, exit, user_time, system_time;
|
Chris@16
|
76
|
Chris@16
|
77 if ( boost::detail::winapi::GetThreadTimes(
|
Chris@16
|
78 boost::detail::winapi::GetCurrentThread (), &creation, &exit,
|
Chris@16
|
79 &system_time, &user_time ) )
|
Chris@16
|
80 {
|
Chris@16
|
81 duration user = duration(
|
Chris@16
|
82 ((static_cast<duration::rep>(user_time.dwHighDateTime) << 32)
|
Chris@16
|
83 | user_time.dwLowDateTime) * 100 );
|
Chris@16
|
84
|
Chris@16
|
85 duration system = duration(
|
Chris@16
|
86 ((static_cast<duration::rep>(system_time.dwHighDateTime) << 32)
|
Chris@16
|
87 | system_time.dwLowDateTime) * 100 );
|
Chris@16
|
88
|
Chris@16
|
89 return time_point(system+user);
|
Chris@16
|
90 }
|
Chris@16
|
91 else
|
Chris@16
|
92 {
|
Chris@16
|
93 BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
|
Chris@16
|
94 return time_point();
|
Chris@16
|
95 }
|
Chris@16
|
96
|
Chris@16
|
97 }
|
Chris@16
|
98
|
Chris@16
|
99 } // namespace chrono
|
Chris@16
|
100 } // namespace boost
|
Chris@16
|
101
|
Chris@16
|
102 #endif
|