1 /*
2 * Copyright (c) 2012, 2013, 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_VM_TRACE_TRACEEVENT_HPP
26 #define SHARE_VM_TRACE_TRACEEVENT_HPP
27
28 #include "utilities/macros.hpp"
29
30 enum EventStartTime {
31 UNTIMED,
32 TIMED
33 };
34
35 #if INCLUDE_TRACE
36 #include "trace/traceBackend.hpp"
37 #include "trace/tracing.hpp"
38 #include "tracefiles/traceEventIds.hpp"
39 #include "tracefiles/traceTypes.hpp"
40 #include "utilities/ticks.hpp"
41
42 template<typename T>
43 class TraceEvent : public StackObj {
44 private:
45 bool _started;
46 #ifdef ASSERT
47 bool _committed;
48 bool _cancelled;
49 protected:
50 bool _ignore_check;
51 #endif
52
53 protected:
54 jlong _startTime;
55 jlong _endTime;
56
57 void set_starttime(const TracingTime& time) {
58 _startTime = time;
59 }
60
61 void set_endtime(const TracingTime& time) {
62 _endTime = time;
63 }
64
65 public:
66 TraceEvent(EventStartTime timing=TIMED) :
67 _startTime(0),
68 _endTime(0),
69 _started(false)
70 #ifdef ASSERT
71 ,
72 _committed(false),
73 _cancelled(false),
74 _ignore_check(false)
75 #endif
76 {
77 if (T::is_enabled()) {
78 _started = true;
79 if (timing == TIMED && !T::isInstant) {
80 static_cast<T *>(this)->set_starttime(Tracing::time());
81 }
82 }
83 }
84
85 static bool is_enabled() {
86 return Tracing::is_event_enabled(T::eventId);
87 }
88
89 bool should_commit() {
90 return _started;
91 }
92
93 void ignoreCheck() {
94 DEBUG_ONLY(_ignore_check = true);
95 }
96
97 void commit() {
98 if (!should_commit()) {
99 cancel();
100 return;
101 }
102 if (_endTime == 0) {
103 static_cast<T*>(this)->set_endtime(Tracing::time());
104 }
105 if (static_cast<T*>(this)->should_write()) {
106 static_cast<T*>(this)->writeEvent();
107 }
108 set_commited();
109 }
110
111 void set_starttime(const Ticks& time) {
112 _startTime = time.value();
113 }
114
115 void set_endtime(const Ticks& time) {
116 _endTime = time.value();
117 }
118
119 TraceEventId id() const {
120 return T::eventId;
121 }
122
123 bool is_instant() const {
124 return T::isInstant;
125 }
126
127 bool is_requestable() const {
128 return T::isRequestable;
129 }
130
131 bool has_thread() const {
132 return T::hasThread;
133 }
134
135 bool has_stacktrace() const {
136 return T::hasStackTrace;
137 }
138
139 void cancel() {
140 assert(!_committed && !_cancelled, "event was already committed/cancelled");
141 DEBUG_ONLY(_cancelled = true);
142 }
143
144 void set_commited() {
145 assert(!_committed, "event has already been committed");
146 DEBUG_ONLY(_committed = true);
147 }
148
149 ~TraceEvent() {
150 if (_started) {
151 assert(_ignore_check || _committed || _cancelled, "event was not committed/cancelled");
152 }
153 }
154 };
155
156 #endif // INCLUDE_TRACE
157 #endif // SHARE_VM_TRACE_TRACEEVENT_HPP
|
1 /*
2 * Copyright (c) 2012, 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 #ifndef SHARE_VM_TRACE_TRACEEVENT_HPP
26 #define SHARE_VM_TRACE_TRACEEVENT_HPP
27
28 #include "jfr/utilities/jfrTraceTime.hpp"
29 #include "utilities/macros.hpp"
30
31 enum EventStartTime {
32 UNTIMED,
33 TIMED
34 };
35
36 #if INCLUDE_TRACE
37 #include "trace/traceBackend.hpp"
38 #include "tracefiles/traceEventIds.hpp"
39 #include "utilities/ticks.hpp"
40
41 template<typename T>
42 class TraceEvent {
43 private:
44 bool _started;
45
46 protected:
47 jlong _startTime;
48 jlong _endTime;
49 DEBUG_ONLY(bool _committed;)
50 void set_starttime(const JfrTraceTime& time) {
51 _startTime = time;
52 }
53
54 void set_endtime(const JfrTraceTime& time) {
55 _endTime = time;
56 }
57
58 TraceEvent(EventStartTime timing=TIMED) :
59 _startTime(0),
60 _endTime(0),
61 _started(false)
62 #ifdef ASSERT
63 , _committed(false)
64 #endif
65 {
66 if (T::is_enabled()) {
67 _started = true;
68 if (TIMED == timing && !T::isInstant) {
69 static_cast<T*>(this)->set_starttime(Tracing::time());
70 }
71 }
72 }
73 public:
74 void set_starttime(const Ticks& time) {
75 _startTime = time.value();
76 }
77
78 void set_endtime(const Ticks& time) {
79 _endTime = time.value();
80 }
81
82 static bool is_enabled() {
83 return EnableJFR && Tracing::is_event_enabled(T::eventId);
84 }
85
86 bool should_commit() {
87 return _started;
88 }
89
90 void commit() {
91 if (!should_commit()) {
92 return;
93 }
94 assert(!_committed, "event already committed");
95 if (_startTime == 0) {
96 static_cast<T*>(this)->set_starttime(Tracing::time());
97 } else if (_endTime == 0) {
98 static_cast<T*>(this)->set_endtime(Tracing::time());
99 }
100 if (static_cast<T*>(this)->should_write()) {
101 static_cast<T*>(this)->writeEvent();
102 DEBUG_ONLY(_committed = true;)
103 }
104 }
105
106 static TraceEventId id() {
107 return T::eventId;
108 }
109
110 static bool is_instant() {
111 return T::isInstant;
112 }
113
114 static bool is_requestable() {
115 return T::isRequestable;
116 }
117
118 static bool has_thread() {
119 return T::hasThread;
120 }
121
122 static bool has_stacktrace() {
123 return T::hasStackTrace;
124 }
125 };
126
127 #endif // INCLUDE_TRACE
128 #endif // SHARE_VM_TRACE_TRACEEVENT_HPP
|