< prev index next >
src/hotspot/share/utilities/ticks.cpp
Print this page
rev 49619 : JEP 328 : Flight Recorder open source preview
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
@@ -24,45 +24,110 @@
#include "precompiled.hpp"
#include "runtime/os.hpp"
#include "utilities/ticks.inline.hpp"
-#ifdef ASSERT
- const jlong Ticks::invalid_time_stamp = -2; // 0xFFFF FFFF`FFFF FFFE
+#ifdef X86
+#include "rdtsc_x86.hpp"
#endif
-void Ticks::stamp() {
- _stamp_ticks = os::elapsed_counter();
+#include OS_CPU_HEADER(os)
+
+ElapsedCounterStamped::ElapsedCounterStamped() : ElapsedCounter(os::elapsed_counter()) {}
+
+void ElapsedCounter::stamp() {
+ _instant = now().value();
+}
+
+ElapsedCounter ElapsedCounter::now() {
+ return ElapsedCounterStamped();
+}
+
+#ifdef X86
+FastElapsedCounterStamped::FastElapsedCounterStamped() : FastElapsedCounter(Rdtsc::elapsed_counter()) {}
+#else
+FastElapsedCounterStamped::FastElapsedCounterStamped() : FastElapsedCounter(os::elapsed_counter()) {}
+#endif
+
+void FastElapsedCounter::stamp() {
+ _instant = now().value();
+}
+
+FastElapsedCounter FastElapsedCounter::now() {
+ return FastElapsedCounterStamped();
+}
+
+TraceElapsedInterval::TraceElapsedInterval(const TraceElapsedCounter& end, const TraceElapsedCounter& start) :
+ _elapsed_interval(end.value() - start.value())
+#ifdef X86
+ , _ft_elapsed_interval(end.ft_value() - start.ft_value())
+#endif
+ {}
+
+TraceElapsedInterval::TraceElapsedInterval(jlong interval) :
+ _elapsed_interval(interval)
+#ifdef X86
+ , _ft_elapsed_interval(interval)
+#endif
+ {}
+
+TraceElapsedInterval& TraceElapsedInterval::operator+=(const TraceElapsedInterval& rhs) {
+ _elapsed_interval += rhs._elapsed_interval;
+ X86_ONLY(_ft_elapsed_interval += rhs._ft_elapsed_interval;)
+ return *this;
}
-const Ticks Ticks::now() {
- Ticks t;
- t.stamp();
- return t;
+TraceElapsedInterval& TraceElapsedInterval::operator-=(const TraceElapsedInterval& rhs) {
+ _elapsed_interval -= rhs._elapsed_interval;
+ X86_ONLY(_ft_elapsed_interval -= rhs._ft_elapsed_interval;)
+ return *this;
}
-Tickspan::Tickspan(const Ticks& end, const Ticks& start) {
- assert(end.value() != Ticks::invalid_time_stamp, "end is unstamped!");
- assert(start.value() != Ticks::invalid_time_stamp, "start is unstamped!");
+jlong TraceElapsedInterval::ft_value() const {
+#ifdef X86
+ return _ft_elapsed_interval.value();
+#else
+ return _elapsed_interval.value();
+#endif
+}
- assert(end >= start, "negative time!");
+TraceElapsedCounter::TraceElapsedCounter(jlong stamp) :
+ _elapsed(stamp)
+#ifdef X86
+ , _ft_elapsed(stamp)
+#endif
+ {}
- _span_ticks = end.value() - start.value();
+TraceElapsedCounter TraceElapsedCounter::now() {
+ TraceElapsedCounterStamped dec;
+ return dec;
}
-template <typename ReturnType>
-static ReturnType time_conversion(const Tickspan& span, TicksToTimeHelper::Unit unit) {
- assert(TicksToTimeHelper::SECONDS == unit ||
- TicksToTimeHelper::MILLISECONDS == unit, "invalid unit!");
+TraceElapsedCounter& TraceElapsedCounter::operator+=(const TraceElapsedInterval& rhs) {
+ _elapsed += rhs.value();
+ X86_ONLY(_ft_elapsed += rhs.ft_value();)
+ return *this;
+}
- ReturnType frequency_per_unit = (ReturnType)os::elapsed_frequency() / (ReturnType)unit;
+TraceElapsedCounter& TraceElapsedCounter::operator-=(const TraceElapsedInterval& rhs) {
+ _elapsed -= rhs.value();
+ X86_ONLY(_ft_elapsed -= rhs.ft_value();)
+ return *this;
+}
- return (ReturnType) ((ReturnType)span.value() / frequency_per_unit);
+void TraceElapsedCounter::stamp() {
+ _elapsed.stamp();
+ X86_ONLY(_ft_elapsed.stamp();)
}
-double TicksToTimeHelper::seconds(const Tickspan& span) {
- return time_conversion<double>(span, SECONDS);
+jlong TraceElapsedCounter::ft_value() const {
+#ifdef X86
+ return _ft_elapsed.value();
+#else
+ return _elapsed.value();
+#endif
}
-jlong TicksToTimeHelper::milliseconds(const Tickspan& span) {
- return time_conversion<jlong>(span, MILLISECONDS);
+TraceElapsedCounterStamped::TraceElapsedCounterStamped() : TraceElapsedCounter() {
+ _elapsed.stamp();
+ X86_ONLY(_ft_elapsed.stamp());
}
< prev index next >