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