93 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | //  boost thread_clock.cpp  -----------------------------------------------------------// | ||
|  | 
 | ||
|  | //  Copyright Beman Dawes 1994, 2006, 2008 | ||
|  | //  Copyright Vicente J. Botet Escriba 2009-2011 | ||
|  | 
 | ||
|  | //  Distributed under the Boost Software License, Version 1.0. | ||
|  | //  See http://www.boost.org/LICENSE_1_0.txt | ||
|  | 
 | ||
|  | //  See http://www.boost.org/libs/chrono for documentation. | ||
|  | 
 | ||
|  | //--------------------------------------------------------------------------------------// | ||
|  | 
 | ||
|  | #include <boost/chrono/config.hpp> | ||
|  | #include <boost/chrono/thread_clock.hpp> | ||
|  | #include <cassert> | ||
|  | #include <boost/assert.hpp> | ||
|  | 
 | ||
|  | #if !defined(__VXWORKS__) | ||
|  | # include <sys/times.h> | ||
|  | #endif | ||
|  | # include <pthread.h> | ||
|  | # include <unistd.h> | ||
|  | 
 | ||
|  | namespace boost { namespace chrono { | ||
|  | 
 | ||
|  |     thread_clock::time_point thread_clock::now( ) BOOST_NOEXCEPT | ||
|  |     { | ||
|  |       struct timespec ts; | ||
|  | #if defined CLOCK_THREAD_CPUTIME_ID | ||
|  |         // get the timespec associated to the thread clock | ||
|  |         if ( ::clock_gettime( CLOCK_THREAD_CPUTIME_ID, &ts ) ) | ||
|  | #else | ||
|  |         // get the current thread | ||
|  |         pthread_t pth=pthread_self(); | ||
|  |         // get the clock_id associated to the current thread | ||
|  |         clockid_t clock_id; | ||
|  |         pthread_getcpuclockid(pth, &clock_id); | ||
|  |         // get the timespec associated to the thread clock | ||
|  |         if ( ::clock_gettime( clock_id, &ts ) ) | ||
|  | #endif | ||
|  |         { | ||
|  |           BOOST_ASSERT(0 && "Boost::Chrono - Internal Error"); | ||
|  |         } | ||
|  | 
 | ||
|  |         // transform to nanoseconds | ||
|  |         return time_point(duration( | ||
|  |             static_cast<thread_clock::rep>( ts.tv_sec ) * 1000000000 + ts.tv_nsec)); | ||
|  | 
 | ||
|  |     } | ||
|  | 
 | ||
|  | #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING | ||
|  |     thread_clock::time_point thread_clock::now( system::error_code & ec ) | ||
|  |     { | ||
|  |       struct timespec ts; | ||
|  | #if defined CLOCK_THREAD_CPUTIME_ID | ||
|  |         // get the timespec associated to the thread clock | ||
|  |         if ( ::clock_gettime( CLOCK_THREAD_CPUTIME_ID, &ts ) ) | ||
|  | #else | ||
|  |         // get the current thread | ||
|  |         pthread_t pth=pthread_self(); | ||
|  |         // get the clock_id associated to the current thread | ||
|  |         clockid_t clock_id; | ||
|  |         pthread_getcpuclockid(pth, &clock_id); | ||
|  |         // get the timespec associated to the thread clock | ||
|  |         if ( ::clock_gettime( clock_id, &ts ) ) | ||
|  | #endif | ||
|  |         { | ||
|  |             if (BOOST_CHRONO_IS_THROWS(ec)) | ||
|  |             { | ||
|  |                 boost::throw_exception( | ||
|  |                         system::system_error( | ||
|  |                                 errno, | ||
|  |                                 BOOST_CHRONO_SYSTEM_CATEGORY, | ||
|  |                                 "chrono::thread_clock" )); | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 ec.assign( errno, BOOST_CHRONO_SYSTEM_CATEGORY ); | ||
|  |                 return time_point(); | ||
|  |             } | ||
|  |         } | ||
|  |         if (!BOOST_CHRONO_IS_THROWS(ec)) | ||
|  |         { | ||
|  |             ec.clear(); | ||
|  |         } | ||
|  |         // transform to nanoseconds | ||
|  |         return time_point(duration( | ||
|  |             static_cast<thread_clock::rep>( ts.tv_sec ) * 1000000000 + ts.tv_nsec)); | ||
|  | 
 | ||
|  |     } | ||
|  | #endif | ||
|  | } } |