1 /*
   2  * Copyright (c) 2013, 2019, 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 #include "precompiled.hpp"
  26 #include "runtime/os.hpp"
  27 #include "utilities/ticks.inline.hpp"
  28 
  29 #ifdef X86
  30 #include "rdtsc_x86.hpp"
  31 #endif
  32 
  33 #ifdef TARGET_OS_ARCH_linux_x86
  34 # include "os_linux_x86.hpp"
  35 #endif
  36 #ifdef TARGET_OS_ARCH_linux_sparc
  37 # include "os_linux_sparc.hpp"
  38 #endif
  39 #ifdef TARGET_OS_ARCH_linux_zero
  40 # include "os_linux_zero.hpp"
  41 #endif
  42 #ifdef TARGET_OS_ARCH_solaris_x86
  43 # include "os_solaris_x86.hpp"
  44 #endif
  45 #ifdef TARGET_OS_ARCH_solaris_sparc
  46 # include "os_solaris_sparc.hpp"
  47 #endif
  48 #ifdef TARGET_OS_ARCH_windows_x86
  49 # include "os_windows_x86.hpp"
  50 #endif
  51 #ifdef TARGET_OS_ARCH_linux_arm
  52 # include "os_linux_arm.hpp"
  53 #endif
  54 #ifdef TARGET_OS_ARCH_linux_ppc
  55 # include "os_linux_ppc.hpp"
  56 #endif
  57 #ifdef TARGET_OS_ARCH_aix_ppc
  58 # include "os_aix_ppc.hpp"
  59 #endif
  60 #ifdef TARGET_OS_ARCH_bsd_x86
  61 # include "os_bsd_x86.hpp"
  62 #endif
  63 #ifdef TARGET_OS_ARCH_bsd_zero
  64 # include "os_bsd_zero.hpp"
  65 #endif
  66 
  67 ElapsedCounterStamped::ElapsedCounterStamped() : ElapsedCounter(os::elapsed_counter()) {}
  68 
  69 void ElapsedCounter::stamp() {
  70   _instant = now().value();
  71 }
  72 
  73 ElapsedCounter ElapsedCounter::now() {
  74   return ElapsedCounterStamped();
  75 }
  76 
  77 #ifdef X86
  78 FastElapsedCounterStamped::FastElapsedCounterStamped() : FastElapsedCounter(Rdtsc::elapsed_counter()) {}
  79 #else
  80 FastElapsedCounterStamped::FastElapsedCounterStamped() : FastElapsedCounter(os::elapsed_counter()) {}
  81 #endif
  82 
  83 void FastElapsedCounter::stamp() {
  84   _instant = now().value();
  85 }
  86 
  87 FastElapsedCounter FastElapsedCounter::now() {
  88   return FastElapsedCounterStamped();
  89 }
  90 
  91 TraceElapsedInterval::TraceElapsedInterval(const TraceElapsedCounter& end, const TraceElapsedCounter& start) :
  92   _elapsed_interval(end.value() - start.value())
  93 #ifdef X86
  94   , _ft_elapsed_interval(end.ft_value() - start.ft_value())
  95 #endif
  96   {}
  97 
  98 TraceElapsedInterval::TraceElapsedInterval(jlong interval) :
  99   _elapsed_interval(interval)
 100 #ifdef X86
 101   , _ft_elapsed_interval(interval)
 102 #endif
 103   {}
 104 
 105 TraceElapsedInterval& TraceElapsedInterval::operator+=(const TraceElapsedInterval& rhs) {
 106   _elapsed_interval += rhs._elapsed_interval;
 107   X86_ONLY(_ft_elapsed_interval += rhs._ft_elapsed_interval;)
 108   return *this;
 109 }
 110 
 111 TraceElapsedInterval& TraceElapsedInterval::operator-=(const TraceElapsedInterval& rhs) {
 112   _elapsed_interval -= rhs._elapsed_interval;
 113   X86_ONLY(_ft_elapsed_interval -= rhs._ft_elapsed_interval;)
 114   return *this;
 115 }
 116 
 117 jlong TraceElapsedInterval::ft_value() const {
 118 #ifdef X86
 119   return _ft_elapsed_interval.value();
 120 #else
 121   return _elapsed_interval.value();
 122 #endif
 123 }
 124 
 125 TraceElapsedCounter::TraceElapsedCounter(jlong stamp) :
 126   _elapsed(stamp)
 127 #ifdef X86
 128   , _ft_elapsed(stamp)
 129 #endif
 130   {}
 131 
 132 TraceElapsedCounter TraceElapsedCounter::now() {
 133   TraceElapsedCounterStamped dec;
 134   return dec;
 135 }
 136 
 137 TraceElapsedCounter& TraceElapsedCounter::operator+=(const TraceElapsedInterval& rhs) {
 138   _elapsed += rhs.value();
 139   X86_ONLY(_ft_elapsed += rhs.ft_value();)
 140   return *this;
 141 }
 142 
 143 TraceElapsedCounter& TraceElapsedCounter::operator-=(const TraceElapsedInterval& rhs) {
 144   _elapsed -= rhs.value();
 145   X86_ONLY(_ft_elapsed -= rhs.ft_value();)
 146   return *this;
 147 }
 148 
 149 void TraceElapsedCounter::stamp() {
 150   _elapsed.stamp();
 151   X86_ONLY(_ft_elapsed.stamp();)
 152 }
 153 
 154 jlong TraceElapsedCounter::ft_value() const {
 155 #ifdef X86
 156   return _ft_elapsed.value();
 157 #else
 158   return _elapsed.value();
 159 #endif
 160 }
 161 
 162 TraceElapsedCounterStamped::TraceElapsedCounterStamped() : TraceElapsedCounter() {
 163   _elapsed.stamp();
 164   X86_ONLY(_ft_elapsed.stamp());
 165 }