357 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			357 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //  boost process_cpu_clocks.cpp  -----------------------------------------------------------//
 | |
| 
 | |
| //  Copyright Beman Dawes 1994, 2006, 2008
 | |
| //  Copyright Vicente J. Botet Escriba 2009
 | |
| 
 | |
| //  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/process_cpu_clocks.hpp>
 | |
| #include <boost/assert.hpp>
 | |
| 
 | |
| #include <sys/time.h> //for gettimeofday and timeval
 | |
| #include <sys/times.h> //for times
 | |
| # include <unistd.h>
 | |
| 
 | |
| namespace boost
 | |
| {
 | |
|   namespace chrono
 | |
|   {
 | |
|     namespace chrono_detail
 | |
|     {
 | |
| 
 | |
|       inline long tick_factor() // multiplier to convert ticks
 | |
|       //  to nanoseconds; -1 if unknown
 | |
|       {
 | |
|         long factor = 0;
 | |
|         if (!factor)
 | |
|         {
 | |
|           if ((factor = ::sysconf(_SC_CLK_TCK)) <= 0)
 | |
|             factor = -1;
 | |
|           else
 | |
|           {
 | |
|             BOOST_ASSERT(factor <= 1000000000l); // doesn't handle large ticks
 | |
|             factor = 1000000000l / factor; // compute factor
 | |
|             if (!factor)
 | |
|               factor = -1;
 | |
|           }
 | |
|         }
 | |
|         return factor;
 | |
|       }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     process_real_cpu_clock::time_point process_real_cpu_clock::now() BOOST_NOEXCEPT
 | |
|     {
 | |
| #if 1
 | |
|       tms tm;
 | |
|       clock_t c = ::times(&tm);
 | |
|       if (c == clock_t(-1)) // error
 | |
|       {
 | |
|         BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
 | |
|       } else
 | |
|       {
 | |
|         long factor = chrono_detail::tick_factor();
 | |
|         if (factor != -1)
 | |
|         {
 | |
|           return time_point(nanoseconds(c * factor));
 | |
|         } else
 | |
|         {
 | |
|           BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
 | |
|         }
 | |
|       }
 | |
|       return time_point();
 | |
| #else
 | |
|       clock_t c = ::clock();
 | |
|       if (c == clock_t(-1)) // error
 | |
|       {
 | |
|         BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
 | |
|       } else
 | |
|       {
 | |
|         long factor = chrono_detail::tick_factor();
 | |
|         if (factor != -1)
 | |
|         {
 | |
|           return time_point(nanoseconds(c * factor));
 | |
|         } else
 | |
|         {
 | |
|           BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
 | |
|         }
 | |
|       }
 | |
|       return time_point();
 | |
| #endif
 | |
|     }
 | |
| 
 | |
| #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
 | |
|     process_real_cpu_clock::time_point process_real_cpu_clock::now(system::error_code & ec)
 | |
|     {
 | |
| 
 | |
| #if 1
 | |
|       tms tm;
 | |
|       clock_t c = ::times(&tm);
 | |
|       if (c == clock_t(-1)) // error
 | |
|       {
 | |
|         if (BOOST_CHRONO_IS_THROWS(ec))
 | |
|         {
 | |
|           boost::throw_exception(system::system_error(errno, BOOST_CHRONO_SYSTEM_CATEGORY, "chrono::process_real_cpu_clock"));
 | |
|         } else
 | |
|         {
 | |
|           ec.assign(errno, BOOST_CHRONO_SYSTEM_CATEGORY);
 | |
|           return time_point();
 | |
|         }
 | |
|       } else
 | |
|       {
 | |
|         long factor = chrono_detail::tick_factor();
 | |
|         if (factor != -1)
 | |
|         {
 | |
|           if (!BOOST_CHRONO_IS_THROWS(ec))
 | |
|           {
 | |
|             ec.clear();
 | |
|           }
 | |
|           return time_point(nanoseconds(c * factor));
 | |
|         } else
 | |
|         {
 | |
|           if (BOOST_CHRONO_IS_THROWS(ec))
 | |
|           {
 | |
|             boost::throw_exception(system::system_error(errno, BOOST_CHRONO_SYSTEM_CATEGORY, "chrono::process_real_cpu_clock"));
 | |
|           } else
 | |
|           {
 | |
|             ec.assign(errno, BOOST_CHRONO_SYSTEM_CATEGORY);
 | |
|             return time_point();
 | |
|           }
 | |
|         }
 | |
|       }
 | |
| #else
 | |
|       clock_t c = ::clock();
 | |
|       if (c == clock_t(-1)) // error
 | |
|       {
 | |
|         if (BOOST_CHRONO_IS_THROWS(ec))
 | |
|         {
 | |
|           boost::throw_exception(system::system_error(errno, BOOST_CHRONO_SYSTEM_CATEGORY, "chrono::process_real_cpu_clock"));
 | |
|         } else
 | |
|         {
 | |
|           ec.assign(errno, BOOST_CHRONO_SYSTEM_CATEGORY);
 | |
|           return time_point();
 | |
|         }
 | |
|       } else
 | |
|       {
 | |
|         long factor = chrono_detail::tick_factor();
 | |
|         if (factor != -1)
 | |
|         {
 | |
|           if (!BOOST_CHRONO_IS_THROWS(ec))
 | |
|           {
 | |
|             ec.clear();
 | |
|           }
 | |
|           return time_point(nanoseconds(c * factor));
 | |
|         } else
 | |
|         {
 | |
|           if (BOOST_CHRONO_IS_THROWS(ec))
 | |
|           {
 | |
|             boost::throw_exception(system::system_error(errno, BOOST_CHRONO_SYSTEM_CATEGORY, "chrono::process_real_cpu_clock"));
 | |
|           } else
 | |
|           {
 | |
|             ec.assign(errno, BOOST_CHRONO_SYSTEM_CATEGORY);
 | |
|             return time_point();
 | |
|           }
 | |
|         }
 | |
|       }
 | |
| #endif
 | |
| 
 | |
|     }
 | |
| #endif
 | |
| 
 | |
| #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
 | |
|     process_user_cpu_clock::time_point process_user_cpu_clock::now(system::error_code & ec)
 | |
|     {
 | |
|       tms tm;
 | |
|       clock_t c = ::times(&tm);
 | |
|       if (c == clock_t(-1)) // error
 | |
|       {
 | |
|         if (BOOST_CHRONO_IS_THROWS(ec))
 | |
|         {
 | |
|           boost::throw_exception(system::system_error(errno, BOOST_CHRONO_SYSTEM_CATEGORY, "chrono::process_user_cpu_clock"));
 | |
|         } else
 | |
|         {
 | |
|           ec.assign(errno, BOOST_CHRONO_SYSTEM_CATEGORY);
 | |
|           return time_point();
 | |
|         }
 | |
|       } else
 | |
|       {
 | |
|         long factor = chrono_detail::tick_factor();
 | |
|         if (factor != -1)
 | |
|         {
 | |
|           if (!BOOST_CHRONO_IS_THROWS(ec))
 | |
|           {
 | |
|             ec.clear();
 | |
|           }
 | |
|           return time_point(nanoseconds((tm.tms_utime + tm.tms_cutime) * factor));
 | |
|         } else
 | |
|         {
 | |
|           if (BOOST_CHRONO_IS_THROWS(ec))
 | |
|           {
 | |
|             boost::throw_exception(system::system_error(errno, BOOST_CHRONO_SYSTEM_CATEGORY, "chrono::process_user_cpu_clock"));
 | |
|           } else
 | |
|           {
 | |
|             ec.assign(errno, BOOST_CHRONO_SYSTEM_CATEGORY);
 | |
|             return time_point();
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|     process_user_cpu_clock::time_point process_user_cpu_clock::now() BOOST_NOEXCEPT
 | |
|     {
 | |
|       tms tm;
 | |
|       clock_t c = ::times(&tm);
 | |
|       if (c == clock_t(-1)) // error
 | |
|       {
 | |
|         BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
 | |
|       } else
 | |
|       {
 | |
|         long factor = chrono_detail::tick_factor();
 | |
|         if (factor != -1)
 | |
|         {
 | |
|           return time_point(nanoseconds((tm.tms_utime + tm.tms_cutime)
 | |
|               * factor));
 | |
|         } else
 | |
|         {
 | |
|           BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
 | |
|         }
 | |
|       }
 | |
|       return time_point();
 | |
|     }
 | |
|     process_system_cpu_clock::time_point process_system_cpu_clock::now() BOOST_NOEXCEPT
 | |
|     {
 | |
|       tms tm;
 | |
|       clock_t c = ::times(&tm);
 | |
|       if (c == clock_t(-1)) // error
 | |
|       {
 | |
|         BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
 | |
|       } else
 | |
|       {
 | |
|         long factor = chrono_detail::tick_factor();
 | |
|         if (factor != -1)
 | |
|         {
 | |
|           return time_point(nanoseconds((tm.tms_stime + tm.tms_cstime)
 | |
|               * factor));
 | |
|         } else
 | |
|         {
 | |
|           BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
 | |
|         }
 | |
|       }
 | |
|       return time_point();
 | |
|     }
 | |
| 
 | |
| #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
 | |
|     process_system_cpu_clock::time_point process_system_cpu_clock::now(system::error_code & ec)
 | |
|     {
 | |
|       tms tm;
 | |
|       clock_t c = ::times(&tm);
 | |
|       if (c == clock_t(-1)) // error
 | |
|       {
 | |
|         if (BOOST_CHRONO_IS_THROWS(ec))
 | |
|         {
 | |
|           boost::throw_exception(system::system_error(errno, BOOST_CHRONO_SYSTEM_CATEGORY, "chrono::process_system_cpu_clock"));
 | |
|         } else
 | |
|         {
 | |
|           ec.assign(errno, BOOST_CHRONO_SYSTEM_CATEGORY);
 | |
|           return time_point();
 | |
|         }
 | |
|       } else
 | |
|       {
 | |
|         long factor = chrono_detail::tick_factor();
 | |
|         if (factor != -1)
 | |
|         {
 | |
|           if (!BOOST_CHRONO_IS_THROWS(ec))
 | |
|           {
 | |
|             ec.clear();
 | |
|           }
 | |
|           return time_point(nanoseconds((tm.tms_stime + tm.tms_cstime) * factor));
 | |
|         } else
 | |
|         {
 | |
|           if (BOOST_CHRONO_IS_THROWS(ec))
 | |
|           {
 | |
|             boost::throw_exception(system::system_error(errno, BOOST_CHRONO_SYSTEM_CATEGORY, "chrono::process_system_cpu_clock"));
 | |
|           } else
 | |
|           {
 | |
|             ec.assign(errno, BOOST_CHRONO_SYSTEM_CATEGORY);
 | |
|             return time_point();
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|     process_cpu_clock::time_point process_cpu_clock::now() BOOST_NOEXCEPT
 | |
|     {
 | |
|       tms tm;
 | |
|       clock_t c = ::times(&tm);
 | |
|       if (c == clock_t(-1)) // error
 | |
|       {
 | |
|         BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
 | |
|       } else
 | |
|       {
 | |
|         long factor = chrono_detail::tick_factor();
 | |
|         if (factor != -1)
 | |
|         {
 | |
|           time_point::rep
 | |
|               r(c * factor, (tm.tms_utime + tm.tms_cutime) * factor, (tm.tms_stime
 | |
|                   + tm.tms_cstime) * factor);
 | |
|           return time_point(duration(r));
 | |
|         } else
 | |
|         {
 | |
|           BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
 | |
|         }
 | |
|       }
 | |
|       return time_point();
 | |
|     }
 | |
| 
 | |
| #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
 | |
|     process_cpu_clock::time_point process_cpu_clock::now(system::error_code & ec)
 | |
|     {
 | |
| 
 | |
|       tms tm;
 | |
|       clock_t c = ::times(&tm);
 | |
|       if (c == clock_t(-1)) // error
 | |
|       {
 | |
|         if (BOOST_CHRONO_IS_THROWS(ec))
 | |
|         {
 | |
|           boost::throw_exception(system::system_error(errno, BOOST_CHRONO_SYSTEM_CATEGORY, "chrono::process_clock"));
 | |
|         } else
 | |
|         {
 | |
|           ec.assign(errno, BOOST_CHRONO_SYSTEM_CATEGORY);
 | |
|           return time_point();
 | |
|         }
 | |
|       } else
 | |
|       {
 | |
|         long factor = chrono_detail::tick_factor();
 | |
|         if (factor != -1)
 | |
|         {
 | |
|           time_point::rep
 | |
|               r(c * factor, (tm.tms_utime + tm.tms_cutime) * factor, (tm.tms_stime
 | |
|                   + tm.tms_cstime) * factor);
 | |
|           return time_point(duration(r));
 | |
|         } else
 | |
|         {
 | |
|           if (BOOST_CHRONO_IS_THROWS(ec))
 | |
|           {
 | |
|             boost::throw_exception(system::system_error(errno, BOOST_CHRONO_SYSTEM_CATEGORY, "chrono::process_clock"));
 | |
|           } else
 | |
|           {
 | |
|             ec.assign(errno, BOOST_CHRONO_SYSTEM_CATEGORY);
 | |
|             return time_point();
 | |
|           }
 | |
|         }
 | |
|       }
 | |
| 
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|   }
 | |
| }
 | 
