Chris@16: // boost thread_clock.cpp -----------------------------------------------------------// Chris@16: Chris@16: // Copyright 2010 Vicente J. Botet Escriba Chris@16: Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // See http://www.boost.org/LICENSE_1_0.txt Chris@16: Chris@16: // See http://www.boost.org/libs/chrono for documentation. Chris@16: Chris@16: //--------------------------------------------------------------------------------------// Chris@16: #ifndef BOOST_CHRONO_DETAIL_INLINED_WIN_THREAD_CLOCK_HPP Chris@16: #define BOOST_CHRONO_DETAIL_INLINED_WIN_THREAD_CLOCK_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace chrono Chris@16: { Chris@16: Chris@16: #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING Chris@16: thread_clock::time_point thread_clock::now( system::error_code & ec ) Chris@16: { Chris@16: // note that Windows uses 100 nanosecond ticks for FILETIME Chris@16: boost::detail::winapi::FILETIME_ creation, exit, user_time, system_time; Chris@16: Chris@16: if ( boost::detail::winapi::GetThreadTimes( Chris@16: boost::detail::winapi::GetCurrentThread (), &creation, &exit, Chris@16: &system_time, &user_time ) ) Chris@16: { Chris@16: duration user = duration( Chris@16: ((static_cast(user_time.dwHighDateTime) << 32) Chris@16: | user_time.dwLowDateTime) * 100 ); Chris@16: Chris@16: duration system = duration( Chris@16: ((static_cast(system_time.dwHighDateTime) << 32) Chris@16: | system_time.dwLowDateTime) * 100 ); Chris@16: Chris@16: if (!BOOST_CHRONO_IS_THROWS(ec)) Chris@16: { Chris@16: ec.clear(); Chris@16: } Chris@16: return time_point(system+user); Chris@16: Chris@16: } Chris@16: else Chris@16: { Chris@16: if (BOOST_CHRONO_IS_THROWS(ec)) Chris@16: { Chris@16: boost::throw_exception( Chris@16: system::system_error( Chris@16: boost::detail::winapi::GetLastError(), Chris@16: BOOST_CHRONO_SYSTEM_CATEGORY, Chris@16: "chrono::thread_clock" )); Chris@16: } Chris@16: else Chris@16: { Chris@16: ec.assign( boost::detail::winapi::GetLastError(), BOOST_CHRONO_SYSTEM_CATEGORY ); Chris@16: return thread_clock::time_point(duration(0)); Chris@16: } Chris@16: } Chris@16: } Chris@16: #endif Chris@16: Chris@16: thread_clock::time_point thread_clock::now() BOOST_NOEXCEPT Chris@16: { Chris@16: Chris@16: // note that Windows uses 100 nanosecond ticks for FILETIME Chris@16: boost::detail::winapi::FILETIME_ creation, exit, user_time, system_time; Chris@16: Chris@16: if ( boost::detail::winapi::GetThreadTimes( Chris@16: boost::detail::winapi::GetCurrentThread (), &creation, &exit, Chris@16: &system_time, &user_time ) ) Chris@16: { Chris@16: duration user = duration( Chris@16: ((static_cast(user_time.dwHighDateTime) << 32) Chris@16: | user_time.dwLowDateTime) * 100 ); Chris@16: Chris@16: duration system = duration( Chris@16: ((static_cast(system_time.dwHighDateTime) << 32) Chris@16: | system_time.dwLowDateTime) * 100 ); Chris@16: Chris@16: return time_point(system+user); Chris@16: } Chris@16: else Chris@16: { Chris@16: BOOST_ASSERT(0 && "Boost::Chrono - Internal Error"); Chris@16: return time_point(); Chris@16: } Chris@16: Chris@16: } Chris@16: Chris@16: } // namespace chrono Chris@16: } // namespace boost Chris@16: Chris@16: #endif