chrono.hpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // posix/chrono.cpp --------------------------------------------------------------//
  2. // Copyright Beman Dawes 2008
  3. // Copyright Vicente J. Botet Escriba 2009
  4. // Distributed under the Boost Software License, Version 1.0.
  5. // See http://www.boost.org/LICENSE_1_0.txt
  6. //----------------------------------------------------------------------------//
  7. // POSIX //
  8. //----------------------------------------------------------------------------//
  9. #include <time.h> // for clock_gettime
  10. namespace boost
  11. {
  12. namespace chrono
  13. {
  14. system_clock::time_point system_clock::now() BOOST_NOEXCEPT
  15. {
  16. timespec ts;
  17. if ( ::clock_gettime( CLOCK_REALTIME, &ts ) )
  18. {
  19. BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
  20. }
  21. return time_point(duration(
  22. static_cast<system_clock::rep>( ts.tv_sec ) * 1000000000 + ts.tv_nsec));
  23. }
  24. #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
  25. system_clock::time_point system_clock::now(system::error_code & ec)
  26. {
  27. timespec ts;
  28. if ( ::clock_gettime( CLOCK_REALTIME, &ts ) )
  29. {
  30. if (BOOST_CHRONO_IS_THROWS(ec))
  31. {
  32. boost::throw_exception(
  33. system::system_error(
  34. errno,
  35. BOOST_CHRONO_SYSTEM_CATEGORY,
  36. "chrono::system_clock" ));
  37. }
  38. else
  39. {
  40. ec.assign( errno, BOOST_CHRONO_SYSTEM_CATEGORY );
  41. return time_point();
  42. }
  43. }
  44. if (!BOOST_CHRONO_IS_THROWS(ec))
  45. {
  46. ec.clear();
  47. }
  48. return time_point(duration(
  49. static_cast<system_clock::rep>( ts.tv_sec ) * 1000000000 + ts.tv_nsec));
  50. }
  51. #endif
  52. std::time_t system_clock::to_time_t(const system_clock::time_point& t) BOOST_NOEXCEPT
  53. {
  54. return static_cast<std::time_t>( t.time_since_epoch().count() / 1000000000 );
  55. }
  56. system_clock::time_point system_clock::from_time_t(std::time_t t) BOOST_NOEXCEPT
  57. {
  58. return time_point(duration(static_cast<system_clock::rep>(t) * 1000000000));
  59. }
  60. #ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
  61. steady_clock::time_point steady_clock::now() BOOST_NOEXCEPT
  62. {
  63. timespec ts;
  64. if ( ::clock_gettime( CLOCK_MONOTONIC, &ts ) )
  65. {
  66. BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
  67. }
  68. return time_point(duration(
  69. static_cast<steady_clock::rep>( ts.tv_sec ) * 1000000000 + ts.tv_nsec));
  70. }
  71. #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
  72. steady_clock::time_point steady_clock::now(system::error_code & ec)
  73. {
  74. timespec ts;
  75. if ( ::clock_gettime( CLOCK_MONOTONIC, &ts ) )
  76. {
  77. if (BOOST_CHRONO_IS_THROWS(ec))
  78. {
  79. boost::throw_exception(
  80. system::system_error(
  81. errno,
  82. BOOST_CHRONO_SYSTEM_CATEGORY,
  83. "chrono::steady_clock" ));
  84. }
  85. else
  86. {
  87. ec.assign( errno, BOOST_CHRONO_SYSTEM_CATEGORY );
  88. return time_point();
  89. }
  90. }
  91. if (!BOOST_CHRONO_IS_THROWS(ec))
  92. {
  93. ec.clear();
  94. }
  95. return time_point(duration(
  96. static_cast<steady_clock::rep>( ts.tv_sec ) * 1000000000 + ts.tv_nsec));
  97. }
  98. #endif
  99. #endif
  100. } // namespace chrono
  101. } // namespace boost