1 // chrono -*- C++ -*- 2 3 // Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 #include <chrono> 26 27 #ifdef _GLIBCXX_USE_C99_STDINT_TR1 28 29 // conditional inclusion of sys/time.h for gettimeofday 30 #if !defined(_GLIBCXX_USE_CLOCK_MONOTONIC) && \ 31 !defined(_GLIBCXX_USE_CLOCK_REALTIME) && \ 32 defined(_GLIBCXX_USE_GETTIMEOFDAY) 33 #include <sys/time.h> 34 #endif 35 36 namespace std _GLIBCXX_VISIBILITY(default) 37 { 38 namespace chrono 39 { 40 _GLIBCXX_BEGIN_NAMESPACE_VERSION 41 42 constexpr bool system_clock::is_steady; 43 44 system_clock::time_point 45 system_clock::now() noexcept 46 { 47 #ifdef _GLIBCXX_USE_CLOCK_REALTIME 48 timespec tp; 49 // -EINVAL, -EFAULT 50 clock_gettime(CLOCK_REALTIME, &tp); 51 return time_point(duration(chrono::seconds(tp.tv_sec) 52 + chrono::nanoseconds(tp.tv_nsec))); 53 #elif defined(_GLIBCXX_USE_GETTIMEOFDAY) 54 timeval tv; 55 // EINVAL, EFAULT 56 gettimeofday(&tv, 0); 57 return time_point(duration(chrono::seconds(tv.tv_sec) 58 + chrono::microseconds(tv.tv_usec))); 59 #else 60 std::time_t __sec = std::time(0); 61 return system_clock::from_time_t(__sec); 62 #endif 63 } 64 65 #ifdef _GLIBCXX_USE_CLOCK_MONOTONIC 66 constexpr bool steady_clock::is_steady; 67 68 steady_clock::time_point 69 steady_clock::now() noexcept 70 { 71 timespec tp; 72 // -EINVAL, -EFAULT 73 clock_gettime(CLOCK_MONOTONIC, &tp); 74 return time_point(duration(chrono::seconds(tp.tv_sec) 75 + chrono::nanoseconds(tp.tv_nsec))); 76 } 77 #endif 78 79 _GLIBCXX_END_NAMESPACE_VERSION 80 } // namespace chrono 81 } // namespace std 82 83 #endif // _GLIBCXX_USE_C99_STDINT_TR1 84