comparison src/share/vm/runtime/timer.cpp @ 10405:f2110083203d

8005849: JEP 167: Event-Based JVM Tracing Reviewed-by: acorn, coleenp, sla Contributed-by: Karen Kinnear <karen.kinnear@oracle.com>, Bengt Rutisson <bengt.rutisson@oracle.com>, Calvin Cheung <calvin.cheung@oracle.com>, Erik Gahlin <erik.gahlin@oracle.com>, Erik Helin <erik.helin@oracle.com>, Jesper Wilhelmsson <jesper.wilhelmsson@oracle.com>, Keith McGuigan <keith.mcguigan@oracle.com>, Mattias Tobiasson <mattias.tobiasson@oracle.com>, Markus Gronlund <markus.gronlund@oracle.com>, Mikael Auno <mikael.auno@oracle.com>, Nils Eliasson <nils.eliasson@oracle.com>, Nils Loodin <nils.loodin@oracle.com>, Rickard Backman <rickard.backman@oracle.com>, Staffan Larsen <staffan.larsen@oracle.com>, Stefan Karlsson <stefan.karlsson@oracle.com>, Yekaterina Kantserova <yekaterina.kantserova@oracle.com>
author sla
date Mon, 10 Jun 2013 11:30:51 +0200
parents 0f80645e9c26
children c0b0974dd509 bdd155477289
comparison
equal deleted inserted replaced
10404:d0add7016434 10405:f2110083203d
1 /* 1 /*
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 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 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
37 #endif 37 #endif
38 #ifdef TARGET_OS_FAMILY_bsd 38 #ifdef TARGET_OS_FAMILY_bsd
39 # include "os_bsd.inline.hpp" 39 # include "os_bsd.inline.hpp"
40 #endif 40 #endif
41 41
42 double TimeHelper::counter_to_seconds(jlong counter) {
43 double count = (double) counter;
44 double freq = (double) os::elapsed_frequency();
45 return counter/freq;
46 }
42 47
43 void elapsedTimer::add(elapsedTimer t) { 48 void elapsedTimer::add(elapsedTimer t) {
44 _counter += t._counter; 49 _counter += t._counter;
45 } 50 }
46 51
57 _active = false; 62 _active = false;
58 } 63 }
59 } 64 }
60 65
61 double elapsedTimer::seconds() const { 66 double elapsedTimer::seconds() const {
62 double count = (double) _counter; 67 return TimeHelper::counter_to_seconds(_counter);
63 double freq = (double) os::elapsed_frequency();
64 return count/freq;
65 } 68 }
66 69
67 jlong elapsedTimer::milliseconds() const { 70 jlong elapsedTimer::milliseconds() const {
68 jlong ticks_per_ms = os::elapsed_frequency() / 1000; 71 jlong ticks_per_ms = os::elapsed_frequency() / 1000;
69 return _counter / ticks_per_ms; 72 return _counter / ticks_per_ms;
88 } 91 }
89 92
90 double TimeStamp::seconds() const { 93 double TimeStamp::seconds() const {
91 assert(is_updated(), "must not be clear"); 94 assert(is_updated(), "must not be clear");
92 jlong new_count = os::elapsed_counter(); 95 jlong new_count = os::elapsed_counter();
93 double count = (double) new_count - _counter; 96 return TimeHelper::counter_to_seconds(new_count - _counter);
94 double freq = (double) os::elapsed_frequency();
95 return count/freq;
96 } 97 }
97 98
98 jlong TimeStamp::milliseconds() const { 99 jlong TimeStamp::milliseconds() const {
99 assert(is_updated(), "must not be clear"); 100 assert(is_updated(), "must not be clear");
100 101
108 assert(is_updated(), "must not be clear"); 109 assert(is_updated(), "must not be clear");
109 return os::elapsed_counter() - _counter; 110 return os::elapsed_counter() - _counter;
110 } 111 }
111 112
112 TraceTime::TraceTime(const char* title, 113 TraceTime::TraceTime(const char* title,
113 bool doit, 114 bool doit) {
114 bool print_cr,
115 outputStream* logfile) {
116 _active = doit; 115 _active = doit;
117 _verbose = true; 116 _verbose = true;
118 _print_cr = print_cr;
119 _logfile = (logfile != NULL) ? logfile : tty;
120 117
121 if (_active) { 118 if (_active) {
122 _accum = NULL; 119 _accum = NULL;
123 _logfile->stamp(PrintGCTimeStamps); 120 tty->stamp(PrintGCTimeStamps);
124 _logfile->print("[%s", title); 121 tty->print("[%s", title);
125 _logfile->flush(); 122 tty->flush();
126 _t.start(); 123 _t.start();
127 } 124 }
128 } 125 }
129 126
130 TraceTime::TraceTime(const char* title, 127 TraceTime::TraceTime(const char* title,
131 elapsedTimer* accumulator, 128 elapsedTimer* accumulator,
132 bool doit, 129 bool doit,
133 bool verbose, 130 bool verbose) {
134 outputStream* logfile) {
135 _active = doit; 131 _active = doit;
136 _verbose = verbose; 132 _verbose = verbose;
137 _print_cr = true;
138 _logfile = (logfile != NULL) ? logfile : tty;
139 if (_active) { 133 if (_active) {
140 if (_verbose) { 134 if (_verbose) {
141 _logfile->stamp(PrintGCTimeStamps); 135 tty->stamp(PrintGCTimeStamps);
142 _logfile->print("[%s", title); 136 tty->print("[%s", title);
143 _logfile->flush(); 137 tty->flush();
144 } 138 }
145 _accum = accumulator; 139 _accum = accumulator;
146 _t.start(); 140 _t.start();
147 } 141 }
148 } 142 }
150 TraceTime::~TraceTime() { 144 TraceTime::~TraceTime() {
151 if (_active) { 145 if (_active) {
152 _t.stop(); 146 _t.stop();
153 if (_accum!=NULL) _accum->add(_t); 147 if (_accum!=NULL) _accum->add(_t);
154 if (_verbose) { 148 if (_verbose) {
155 if (_print_cr) { 149 tty->print_cr(", %3.7f secs]", _t.seconds());
156 _logfile->print_cr(", %3.7f secs]", _t.seconds()); 150 tty->flush();
157 } else {
158 _logfile->print(", %3.7f secs]", _t.seconds());
159 }
160 _logfile->flush();
161 } 151 }
162 } 152 }
163 } 153 }
164 154
165 TraceCPUTime::TraceCPUTime(bool doit, 155 TraceCPUTime::TraceCPUTime(bool doit,