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