1 /* 2 * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #ifndef SHARE_VM_UTILITIES_TICKS_HPP 26 #define SHARE_VM_UTILITIES_TICKS_HPP 27 28 #include "jni.h" 29 #include "memory/allocation.hpp" 30 #include "utilities/macros.hpp" 31 32 template <typename InstantType> 33 class TimeInterval { 34 template <typename, typename> 35 friend TimeInterval operator-(const InstantType& end, const InstantType& start); 36 private: 37 jlong _interval; 38 TimeInterval(const InstantType& end, const InstantType& start) : _interval(end - start) {} 39 public: 40 TimeInterval(jlong interval = 0) : _interval(interval) {} 41 TimeInterval& operator+=(const TimeInterval& rhs); 42 TimeInterval& operator-=(const TimeInterval& rhs); 43 jlong value() const { return _interval; } 44 }; 45 46 class TimeInstant { 47 protected: 48 jlong _instant; 49 public: 50 TimeInstant(jlong stamp = 0) : _instant(stamp) {} 51 TimeInstant& operator+=(const TimeInterval<TimeInstant>& rhs); 52 TimeInstant& operator-=(const TimeInterval<TimeInstant>& rhs); 53 jlong value() const { return _instant; } 54 }; 55 56 class ElapsedCounter : public TimeInstant { 57 public: 58 ElapsedCounter(jlong stamp = 0) : TimeInstant(stamp) {} 59 static ElapsedCounter now(); 60 void stamp(); 61 }; 62 63 class ElapsedCounterStamped : public ElapsedCounter { 64 public: 65 ElapsedCounterStamped(); 66 }; 67 68 class FastElapsedCounter : public TimeInstant { 69 public: 70 FastElapsedCounter(jlong stamp = 0) : TimeInstant(stamp) {} 71 static FastElapsedCounter now(); 72 void stamp(); 73 }; 74 75 class FastElapsedCounterStamped : public FastElapsedCounter { 76 public: 77 FastElapsedCounterStamped(); 78 }; 79 80 typedef TimeInterval<ElapsedCounter> ElapsedCounterInterval; 81 typedef TimeInterval<FastElapsedCounter> FastElapsedCounterInterval; 82 83 class TraceElapsedCounter; 84 85 class TraceElapsedInterval { 86 friend TraceElapsedInterval operator-(const TraceElapsedCounter& end, const TraceElapsedCounter& start); 87 private: 88 ElapsedCounterInterval _elapsed_interval; 89 FastElapsedCounterInterval _ft_elapsed_interval; 90 TraceElapsedInterval(const TraceElapsedCounter& end, const TraceElapsedCounter& start); 91 public: 92 TraceElapsedInterval(jlong interval = 0); 93 TraceElapsedInterval& operator+=(const TraceElapsedInterval& rhs); 94 TraceElapsedInterval& operator-=(const TraceElapsedInterval& rhs); 95 jlong value() const { return _elapsed_interval.value(); } 96 jlong ft_value() const; 97 }; 98 99 class TraceElapsedCounter { 100 protected: 101 ElapsedCounter _elapsed; 102 X86_ONLY(FastElapsedCounter _ft_elapsed;) 103 public: 104 TraceElapsedCounter(jlong stamp = 0); 105 TraceElapsedCounter& operator+=(const TraceElapsedInterval& rhs); 106 TraceElapsedCounter& operator-=(const TraceElapsedInterval& rhs); 107 108 static TraceElapsedCounter now(); 109 void stamp(); 110 jlong value() const { return _elapsed.value(); } 111 jlong ft_value() const; 112 }; 113 114 class TraceElapsedCounterStamped : public TraceElapsedCounter { 115 public: 116 TraceElapsedCounterStamped(); 117 }; 118 119 #if INCLUDE_TRACE 120 typedef TraceElapsedCounter Ticks; 121 typedef TraceElapsedInterval Tickspan; 122 #else 123 typedef ElapsedCounter Ticks; 124 typedef TicksInterval<Ticks> Tickspan; 125 #endif 126 127 #endif // SHARE_VM_UTILITIES_TICKS_HPP