| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 // Time represents an absolute point in coordinated universal time (UTC), | 5 // Time represents an absolute point in coordinated universal time (UTC), | 
| 6 // internally represented as microseconds (s/1,000,000) since the Windows epoch | 6 // internally represented as microseconds (s/1,000,000) since the Windows epoch | 
| 7 // (1601-01-01 00:00:00 UTC) (See http://crbug.com/14734).  System-dependent | 7 // (1601-01-01 00:00:00 UTC). System-dependent clock interface routines are | 
| 8 // clock interface routines are defined in time_PLATFORM.cc. | 8 // defined in time_PLATFORM.cc. Note that values for Time may skew and jump | 
|  | 9 // around as the operating system makes adjustments to synchronize (e.g., with | 
|  | 10 // NTP servers). Thus, client code that uses the Time class must account for | 
|  | 11 // this. | 
| 9 // | 12 // | 
| 10 // TimeDelta represents a duration of time, internally represented in | 13 // TimeDelta represents a duration of time, internally represented in | 
| 11 // microseconds. | 14 // microseconds. | 
| 12 // | 15 // | 
| 13 // TimeTicks represents an abstract time that is most of the time incrementing | 16 // TimeTicks, ThreadTicks, and TraceTicks represent an abstract time that is | 
| 14 // for use in measuring time durations. It is internally represented in | 17 // most of the time incrementing, for use in measuring time durations. | 
| 15 // microseconds.  It can not be converted to a human-readable time, but is | 18 // Internally, they are represented in microseconds. They can not be converted | 
| 16 // guaranteed not to decrease (if the user changes the computer clock, | 19 // to a human-readable time, but are guaranteed not to decrease (unlike the Time | 
| 17 // Time::Now() may actually decrease or jump).  But note that TimeTicks may | 20 // class). Note that TimeTicks may "stand still" (e.g., if the computer is | 
| 18 // "stand still", for example if the computer suspended. | 21 // suspended), and ThreadTicks will "stand still" whenever the thread has been | 
|  | 22 // de-scheduled by the operating system. | 
| 19 // | 23 // | 
| 20 // These classes are represented as only a 64-bit value, so they can be | 24 // All time classes are copyable, assignable, and occupy 64-bits per | 
| 21 // efficiently passed by value. | 25 // instance. Thus, they can be efficiently passed by-value (as opposed to | 
|  | 26 // by-reference). | 
| 22 // | 27 // | 
| 23 // Definitions of operator<< are provided to make these types work with | 28 // Definitions of operator<< are provided to make these types work with | 
| 24 // DCHECK_EQ() and other log macros. For human-readable formatting, see | 29 // DCHECK_EQ() and other log macros. For human-readable formatting, see | 
| 25 // "base/i18n/time_formatting.h". | 30 // "base/i18n/time_formatting.h". | 
|  | 31 // | 
|  | 32 // So many choices!  Which time class should you use?  Examples: | 
|  | 33 // | 
|  | 34 //   Time:        Interpreting the wall-clock time provided by a remote | 
|  | 35 //                system. Detecting whether cached resources have | 
|  | 36 //                expired. Providing the user with a display of the current date | 
|  | 37 //                and time. Determining the amount of time between events across | 
|  | 38 //                re-boots of the machine. | 
|  | 39 // | 
|  | 40 //   TimeTicks:   Tracking the amount of time a task runs. Executing delayed | 
|  | 41 //                tasks at the right time. Computing presentation timestamps. | 
|  | 42 //                Synchronizing audio and video using TimeTicks as a common | 
|  | 43 //                reference clock (lip-sync). Measuring network round-trip | 
|  | 44 //                latency. | 
|  | 45 // | 
|  | 46 //   ThreadTicks: Benchmarking how long the current thread has been doing actual | 
|  | 47 //                work. | 
|  | 48 // | 
|  | 49 //   TraceTicks:  This is only meant to be used by the event tracing | 
|  | 50 //                infrastructure, and by outside code modules in special | 
|  | 51 //                circumstances.  Please be sure to consult a | 
|  | 52 //                base/trace_event/OWNER before committing any new code that | 
|  | 53 //                uses this. | 
| 26 | 54 | 
| 27 #ifndef BASE_TIME_TIME_H_ | 55 #ifndef BASE_TIME_TIME_H_ | 
| 28 #define BASE_TIME_TIME_H_ | 56 #define BASE_TIME_TIME_H_ | 
| 29 | 57 | 
| 30 #include <time.h> | 58 #include <time.h> | 
| 31 | 59 | 
| 32 #include <iosfwd> | 60 #include <iosfwd> | 
| 33 | 61 | 
| 34 #include "base/base_export.h" | 62 #include "base/base_export.h" | 
| 35 #include "base/basictypes.h" | 63 #include "base/basictypes.h" | 
| (...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 632 } | 660 } | 
| 633 | 661 | 
| 634 // For logging use only. | 662 // For logging use only. | 
| 635 BASE_EXPORT std::ostream& operator<<(std::ostream& os, Time time); | 663 BASE_EXPORT std::ostream& operator<<(std::ostream& os, Time time); | 
| 636 | 664 | 
| 637 // TimeTicks ------------------------------------------------------------------ | 665 // TimeTicks ------------------------------------------------------------------ | 
| 638 | 666 | 
| 639 // Represents monotonically non-decreasing clock time. | 667 // Represents monotonically non-decreasing clock time. | 
| 640 class BASE_EXPORT TimeTicks : public time_internal::TimeBase<TimeTicks> { | 668 class BASE_EXPORT TimeTicks : public time_internal::TimeBase<TimeTicks> { | 
| 641  public: | 669  public: | 
| 642   // We define this even without OS_CHROMEOS for seccomp sandbox testing. |  | 
| 643 #if defined(OS_LINUX) |  | 
| 644   // Force definition of the system trace clock; it is a chromeos-only api |  | 
| 645   // at the moment and surfacing it in the right place requires mucking |  | 
| 646   // with glibc et al. |  | 
| 647   static const clockid_t kClockSystemTrace = 11; |  | 
| 648 #endif |  | 
| 649 |  | 
| 650   TimeTicks() : TimeBase(0) { | 670   TimeTicks() : TimeBase(0) { | 
| 651   } | 671   } | 
| 652 | 672 | 
| 653   // Platform-dependent tick count representing "right now." When | 673   // Platform-dependent tick count representing "right now." When | 
| 654   // IsHighResolution() returns false, the resolution of the clock could be | 674   // IsHighResolution() returns false, the resolution of the clock could be | 
| 655   // as coarse as ~15.6ms. Otherwise, the resolution should be no worse than one | 675   // as coarse as ~15.6ms. Otherwise, the resolution should be no worse than one | 
| 656   // microsecond. | 676   // microsecond. | 
| 657   static TimeTicks Now(); | 677   static TimeTicks Now(); | 
| 658 | 678 | 
| 659   // Returns true if the high resolution clock is working on this system and | 679   // Returns true if the high resolution clock is working on this system and | 
| 660   // Now() will return high resolution values. Note that, on systems where the | 680   // Now() will return high resolution values. Note that, on systems where the | 
| 661   // high resolution clock works but is deemed inefficient, the low resolution | 681   // high resolution clock works but is deemed inefficient, the low resolution | 
| 662   // clock will be used instead. | 682   // clock will be used instead. | 
| 663   static bool IsHighResolution(); | 683   static bool IsHighResolution(); | 
| 664 | 684 | 
| 665   // Returns true if ThreadNow() is supported on this system. |  | 
| 666   static bool IsThreadNowSupported() { |  | 
| 667 #if (defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \ |  | 
| 668     (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_ANDROID) |  | 
| 669     return true; |  | 
| 670 #else |  | 
| 671     return false; |  | 
| 672 #endif |  | 
| 673   } |  | 
| 674 |  | 
| 675   // Returns thread-specific CPU-time on systems that support this feature. |  | 
| 676   // Needs to be guarded with a call to IsThreadNowSupported(). Use this timer |  | 
| 677   // to (approximately) measure how much time the calling thread spent doing |  | 
| 678   // actual work vs. being de-scheduled. May return bogus results if the thread |  | 
| 679   // migrates to another CPU between two calls. |  | 
| 680   // |  | 
| 681   // WARNING: The returned value might NOT have the same origin as Now(). Do not |  | 
| 682   // perform math between TimeTicks values returned by Now() and ThreadNow() and |  | 
| 683   // expect meaningful results. |  | 
| 684   // TODO(miu): Since the timeline of these values is different, the values |  | 
| 685   // should be of a different type. |  | 
| 686   static TimeTicks ThreadNow(); |  | 
| 687 |  | 
| 688   // Returns the current system trace time or, if not available on this |  | 
| 689   // platform, a high-resolution time value; or a low-resolution time value if |  | 
| 690   // neither are avalable. On systems where a global trace clock is defined, |  | 
| 691   // timestamping TraceEvents's with this value guarantees synchronization |  | 
| 692   // between events collected inside chrome and events collected outside |  | 
| 693   // (e.g. kernel, X server). |  | 
| 694   // |  | 
| 695   // WARNING: The returned value might NOT have the same origin as Now(). Do not |  | 
| 696   // perform math between TimeTicks values returned by Now() and |  | 
| 697   // NowFromSystemTraceTime() and expect meaningful results. |  | 
| 698   // TODO(miu): Since the timeline of these values is different, the values |  | 
| 699   // should be of a different type. |  | 
| 700   static TimeTicks NowFromSystemTraceTime(); |  | 
| 701 |  | 
| 702 #if defined(OS_WIN) | 685 #if defined(OS_WIN) | 
| 703   // Translates an absolute QPC timestamp into a TimeTicks value. The returned | 686   // Translates an absolute QPC timestamp into a TimeTicks value. The returned | 
| 704   // value has the same origin as Now(). Do NOT attempt to use this if | 687   // value has the same origin as Now(). Do NOT attempt to use this if | 
| 705   // IsHighResolution() returns false. | 688   // IsHighResolution() returns false. | 
| 706   static TimeTicks FromQPCValue(LONGLONG qpc_value); | 689   static TimeTicks FromQPCValue(LONGLONG qpc_value); | 
| 707 #endif | 690 #endif | 
| 708 | 691 | 
| 709   // Get the TimeTick value at the time of the UnixEpoch. This is useful when | 692   // Get the TimeTick value at the time of the UnixEpoch. This is useful when | 
| 710   // you need to relate the value of TimeTicks to a real time and date. | 693   // you need to relate the value of TimeTicks to a real time and date. | 
| 711   // Note: Upon first invocation, this function takes a snapshot of the realtime | 694   // Note: Upon first invocation, this function takes a snapshot of the realtime | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 731 | 714 | 
| 732   // Please use Now() to create a new object. This is for internal use | 715   // Please use Now() to create a new object. This is for internal use | 
| 733   // and testing. | 716   // and testing. | 
| 734   explicit TimeTicks(int64 us) : TimeBase(us) { | 717   explicit TimeTicks(int64 us) : TimeBase(us) { | 
| 735   } | 718   } | 
| 736 }; | 719 }; | 
| 737 | 720 | 
| 738 // For logging use only. | 721 // For logging use only. | 
| 739 BASE_EXPORT std::ostream& operator<<(std::ostream& os, TimeTicks time_ticks); | 722 BASE_EXPORT std::ostream& operator<<(std::ostream& os, TimeTicks time_ticks); | 
| 740 | 723 | 
|  | 724 // ThreadTicks ---------------------------------------------------------------- | 
|  | 725 | 
|  | 726 // Represents a clock, specific to a particular thread, than runs only while the | 
|  | 727 // thread is running. | 
|  | 728 class BASE_EXPORT ThreadTicks : public time_internal::TimeBase<ThreadTicks> { | 
|  | 729  public: | 
|  | 730   ThreadTicks() : TimeBase(0) { | 
|  | 731   } | 
|  | 732 | 
|  | 733   // Returns true if ThreadTicks::Now() is supported on this system. | 
|  | 734   static bool IsSupported() { | 
|  | 735 #if (defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \ | 
|  | 736     (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_ANDROID) | 
|  | 737     return true; | 
|  | 738 #else | 
|  | 739     return false; | 
|  | 740 #endif | 
|  | 741   } | 
|  | 742 | 
|  | 743   // Returns thread-specific CPU-time on systems that support this feature. | 
|  | 744   // Needs to be guarded with a call to IsSupported(). Use this timer | 
|  | 745   // to (approximately) measure how much time the calling thread spent doing | 
|  | 746   // actual work vs. being de-scheduled. May return bogus results if the thread | 
|  | 747   // migrates to another CPU between two calls. | 
|  | 748   static ThreadTicks Now(); | 
|  | 749 | 
|  | 750  private: | 
|  | 751   friend class time_internal::TimeBase<ThreadTicks>; | 
|  | 752 | 
|  | 753   // Please use Now() to create a new object. This is for internal use | 
|  | 754   // and testing. | 
|  | 755   explicit ThreadTicks(int64 us) : TimeBase(us) { | 
|  | 756   } | 
|  | 757 }; | 
|  | 758 | 
|  | 759 // For logging use only. | 
|  | 760 BASE_EXPORT std::ostream& operator<<(std::ostream& os, ThreadTicks time_ticks); | 
|  | 761 | 
|  | 762 // TraceTicks ---------------------------------------------------------------- | 
|  | 763 | 
|  | 764 // Represents high-resolution system trace clock time. | 
|  | 765 class BASE_EXPORT TraceTicks : public time_internal::TimeBase<TraceTicks> { | 
|  | 766  public: | 
|  | 767   // We define this even without OS_CHROMEOS for seccomp sandbox testing. | 
|  | 768 #if defined(OS_LINUX) | 
|  | 769   // Force definition of the system trace clock; it is a chromeos-only api | 
|  | 770   // at the moment and surfacing it in the right place requires mucking | 
|  | 771   // with glibc et al. | 
|  | 772   static const clockid_t kClockSystemTrace = 11; | 
|  | 773 #endif | 
|  | 774 | 
|  | 775   TraceTicks() : TimeBase(0) { | 
|  | 776   } | 
|  | 777 | 
|  | 778   // Returns the current system trace time or, if not available on this | 
|  | 779   // platform, a high-resolution time value; or a low-resolution time value if | 
|  | 780   // neither are avalable. On systems where a global trace clock is defined, | 
|  | 781   // timestamping TraceEvents's with this value guarantees synchronization | 
|  | 782   // between events collected inside chrome and events collected outside | 
|  | 783   // (e.g. kernel, X server). | 
|  | 784   // | 
|  | 785   // On some platforms, the clock source used for tracing can vary depending on | 
|  | 786   // hardware and/or kernel support.  Do not make any assumptions without | 
|  | 787   // consulting the documentation for this functionality in the time_win.cc, | 
|  | 788   // time_posix.cc, etc. files. | 
|  | 789   // | 
|  | 790   // NOTE: This is only meant to be used by the event tracing infrastructure, | 
|  | 791   // and by outside code modules in special circumstances.  Please be sure to | 
|  | 792   // consult a base/trace_event/OWNER before committing any new code that uses | 
|  | 793   // this. | 
|  | 794   static TraceTicks Now(); | 
|  | 795 | 
|  | 796  private: | 
|  | 797   friend class time_internal::TimeBase<TraceTicks>; | 
|  | 798 | 
|  | 799   // Please use Now() to create a new object. This is for internal use | 
|  | 800   // and testing. | 
|  | 801   explicit TraceTicks(int64 us) : TimeBase(us) { | 
|  | 802   } | 
|  | 803 }; | 
|  | 804 | 
|  | 805 // For logging use only. | 
|  | 806 BASE_EXPORT std::ostream& operator<<(std::ostream& os, TraceTicks time_ticks); | 
|  | 807 | 
| 741 }  // namespace base | 808 }  // namespace base | 
| 742 | 809 | 
| 743 #endif  // BASE_TIME_TIME_H_ | 810 #endif  // BASE_TIME_TIME_H_ | 
| OLD | NEW | 
|---|