1 /*
  2  * Copyright (c) 1997, 2020, 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_RUNTIME_TIMER_HPP
 26 #define SHARE_RUNTIME_TIMER_HPP
 27 
 28 #include "utilities/globalDefinitions.hpp"
 29 
 30 // Timers for simple measurement.
 31 
 32 class BaseTimer {
 33   friend class VMStructs;
 34  protected:
 35   jlong _counter;
 36   jlong _start_counter;
 37   bool  _active;
 38 
 39   virtual jlong read_counter() const = 0;
 40 
 41  public:
 42   BaseTimer() {
 43     _active = false;
 44     reset();
 45   }
 46   void add(BaseTimer* t);
 47   void add_nanoseconds(jlong ns);
 48   virtual void start();
 49   virtual void stop();
 50   void reset()               { _counter = 0; }
 51   double seconds() const;
 52   jlong milliseconds() const;
 53   jlong ticks() const        { return _counter; }
 54   jlong active_ticks() const;
 55   bool  is_active() const { return _active; }
 56 };
 57 
 58 class elapsedTimer: public BaseTimer {
 59   friend class VMStructs;
 60  public:
 61   jlong read_counter() const override;
 62 };
 63 
 64 class ThreadTimer: public BaseTimer {
 65  private:
 66   Thread* _owner;
 67  public:
 68   ThreadTimer();
 69   ThreadTimer(Thread* thread) : _owner(thread) {}
 70   void start() override;
 71   void stop() override;
 72   jlong read_counter() const override;
 73 };
 74 
 75 // TimeStamp is used for recording when an event took place.
 76 class TimeStamp {
 77  private:
 78   jlong _counter;
 79  public:
 80   TimeStamp()  { _counter = 0; }
 81   // has the timestamp been updated since being created or cleared?
 82   bool is_updated() const { return _counter != 0; }
 83   // update to current elapsed time
 84   void update();
 85   // update to given elapsed time
 86   void update_to(jlong ticks);
 87   // returns seconds since updated
 88   // (must not be in a cleared state:  must have been previously updated)
 89   double seconds() const;
 90   jlong milliseconds() const;
 91   // ticks elapsed between VM start and last update
 92   jlong ticks() const { return _counter; }
 93   // ticks elapsed since last update
 94   jlong ticks_since_update() const;
 95 };
 96 
 97 class TimeHelper {
 98  public:
 99   static double counter_to_seconds(jlong counter);
100   static double counter_to_millis(jlong counter);
101   static jlong millis_to_counter(jlong millis);
102   static jlong micros_to_counter(jlong micros);
103 };
104 
105 #endif // SHARE_RUNTIME_TIMER_HPP