/Src/Dependencies/Boost/boost/chrono/detail/inlined/posix/chrono.hpp

http://hadesmem.googlecode.com/ · C++ Header · 124 lines · 97 code · 19 blank · 8 comment · 8 complexity · a0aaf6d1c42a1496bdfc53768c71e950 MD5 · raw file

  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()
  15. {
  16. timespec ts;
  17. if ( ::clock_gettime( CLOCK_REALTIME, &ts ) )
  18. {
  19. boost::throw_exception(
  20. system::system_error(
  21. errno,
  22. BOOST_CHRONO_SYSTEM_CATEGORY,
  23. "chrono::system_clock" ));
  24. }
  25. return time_point(duration(
  26. static_cast<system_clock::rep>( ts.tv_sec ) * 1000000000 + ts.tv_nsec));
  27. }
  28. system_clock::time_point system_clock::now(system::error_code & ec)
  29. {
  30. timespec ts;
  31. if ( ::clock_gettime( CLOCK_REALTIME, &ts ) )
  32. {
  33. if (BOOST_CHRONO_IS_THROWS(ec))
  34. {
  35. boost::throw_exception(
  36. system::system_error(
  37. errno,
  38. BOOST_CHRONO_SYSTEM_CATEGORY,
  39. "chrono::system_clock" ));
  40. }
  41. else
  42. {
  43. ec.assign( errno, BOOST_CHRONO_SYSTEM_CATEGORY );
  44. return time_point();
  45. }
  46. }
  47. if (!BOOST_CHRONO_IS_THROWS(ec))
  48. {
  49. ec.clear();
  50. }
  51. return time_point(duration(
  52. static_cast<system_clock::rep>( ts.tv_sec ) * 1000000000 + ts.tv_nsec));
  53. }
  54. std::time_t system_clock::to_time_t(const system_clock::time_point& t)
  55. {
  56. return static_cast<std::time_t>( t.time_since_epoch().count() / 1000000000 );
  57. }
  58. system_clock::time_point system_clock::from_time_t(std::time_t t)
  59. {
  60. return time_point(duration(static_cast<system_clock::rep>(t) * 1000000000));
  61. }
  62. #ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
  63. steady_clock::time_point steady_clock::now()
  64. {
  65. timespec ts;
  66. if ( ::clock_gettime( CLOCK_MONOTONIC, &ts ) )
  67. {
  68. boost::throw_exception(
  69. system::system_error(
  70. errno,
  71. BOOST_CHRONO_SYSTEM_CATEGORY,
  72. "chrono::steady_clock" ));
  73. }
  74. return time_point(duration(
  75. static_cast<steady_clock::rep>( ts.tv_sec ) * 1000000000 + ts.tv_nsec));
  76. }
  77. steady_clock::time_point steady_clock::now(system::error_code & ec)
  78. {
  79. timespec ts;
  80. if ( ::clock_gettime( CLOCK_MONOTONIC, &ts ) )
  81. {
  82. if (BOOST_CHRONO_IS_THROWS(ec))
  83. {
  84. boost::throw_exception(
  85. system::system_error(
  86. errno,
  87. BOOST_CHRONO_SYSTEM_CATEGORY,
  88. "chrono::steady_clock" ));
  89. }
  90. else
  91. {
  92. ec.assign( errno, BOOST_CHRONO_SYSTEM_CATEGORY );
  93. return time_point();
  94. }
  95. }
  96. if (!BOOST_CHRONO_IS_THROWS(ec))
  97. {
  98. ec.clear();
  99. }
  100. return time_point(duration(
  101. static_cast<steady_clock::rep>( ts.tv_sec ) * 1000000000 + ts.tv_nsec));
  102. }
  103. #endif
  104. } // namespace chrono
  105. } // namespace boost