|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r49939 - sandbox/chrono/libs/chrono/src
From: bdawes_at_[hidden]
Date: 2008-11-26 10:05:43
Author: bemandawes
Date: 2008-11-26 10:05:42 EST (Wed, 26 Nov 2008)
New Revision: 49939
URL: http://svn.boost.org/trac/boost/changeset/49939
Log:
Chrono: clean up Windows error handling, fix bugs reported by Howard Hinnant.
Text files modified:
sandbox/chrono/libs/chrono/src/chrono.cpp | 31 +++++++++++++------------------
1 files changed, 13 insertions(+), 18 deletions(-)
Modified: sandbox/chrono/libs/chrono/src/chrono.cpp
==============================================================================
--- sandbox/chrono/libs/chrono/src/chrono.cpp (original)
+++ sandbox/chrono/libs/chrono/src/chrono.cpp 2008-11-26 10:05:42 EST (Wed, 26 Nov 2008)
@@ -10,7 +10,8 @@
#define BOOST_CHRONO_SOURCE
#include <boost/chrono/chrono.hpp>
-#include <stdexcept>
+#include <boost/system/system_error.hpp>
+#include <boost/throw_exception.hpp>
//----------------------------------------------------------------------------//
// //
@@ -29,25 +30,14 @@
namespace
{
- double get_nanosecs_per_tic( boost::system::error_code & ec )
+ double get_nanosecs_per_tic()
{
LARGE_INTEGER freq;
if ( !QueryPerformanceFrequency( &freq ) )
- {
- if ( &ec == &boost::system::throws )
- throw
- std::runtime_error( "monotonic_clock: QueryPerformanceFrequency failed" );
return -1.0;
- }
- if ( &ec != &boost::system::throws ) ec.clear();
return 1000000000.0L / freq.QuadPart;
}
- inline double nanosecs_per_tic( boost::system::error_code & ec )
- {
- static double ns_per_tic = get_nanosecs_per_tic(ec);
- return ns_per_tic;
- }
}
namespace boost
@@ -57,20 +47,25 @@
monotonic_clock::time_point monotonic_clock::now( system::error_code & ec )
{
+ static double nanosecs_per_tic = get_nanosecs_per_tic();
+
LARGE_INTEGER pcount;
- pcount.QuadPart = 1LL; // just in case nanosecs_per_tic(ec) fails
- if ( !QueryPerformanceCounter( &pcount ) )
+ if ( nanosecs_per_tic <= 0.0L || !QueryPerformanceCounter( &pcount ) )
{
+ DWORD cause = (nanosecs_per_tic <= 0.0L ? ERROR_NOT_SUPPORTED : ::GetLastError());
if ( &ec == &system::throws )
- throw
- std::runtime_error( "monotonic_clock: QueryPerformanceCounter failed" );
+ {
+ boost::throw_exception(
+ system::system_error( cause, system::system_category, "monotonic_clock" ));
+ }
+ ec.assign( cause, system::system_category );
return time_point(duration(
static_cast<monotonic_clock::rep>(-1.0) ));
}
if ( &ec != &system::throws ) ec.clear();
return time_point(duration(
- static_cast<monotonic_clock::rep>(nanosecs_per_tic(ec) * pcount.QuadPart) ));
+ static_cast<monotonic_clock::rep>(nanosecs_per_tic * pcount.QuadPart) ));
}
system_clock::time_point system_clock::now( system::error_code & ec )
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