comparison jvmci/jdk.vm.ci.hotspot.jfr/src/jdk/vm/ci/hotspot/jfr/events/JFREventProvider.java @ 22672:1bbd4a7c274b

Rename jdk.internal.jvmci to jdk.vm.ci
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Thu, 08 Oct 2015 17:28:41 -0700
parents jvmci/jdk.internal.jvmci.hotspot.jfr/src/jdk/internal/jvmci/hotspot/jfr/events/JFREventProvider.java@3884a98ebcde
children f2206f5bb62e
comparison
equal deleted inserted replaced
22671:97f30e4d0e95 22672:1bbd4a7c274b
1 /*
2 * Copyright (c) 2014, 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 package jdk.vm.ci.hotspot.jfr.events;
24
25 import static jdk.vm.ci.hotspot.HotSpotVMConfig.config;
26
27 import java.net.URISyntaxException;
28
29 import jdk.vm.ci.hotspot.events.EmptyEventProvider.EmptyCompilationEvent;
30 import jdk.vm.ci.hotspot.events.EmptyEventProvider.EmptyCompilerFailureEvent;
31 import jdk.vm.ci.hotspot.events.EventProvider;
32 import jdk.vm.ci.service.ServiceProvider;
33
34 /**
35 * A JFR implementation for {@link EventProvider}. This implementation is used when Flight Recorder
36 * is turned on.
37 *
38 * Note: The use of fully qualified names for deprecated types is a workaround for <a
39 * href="https://bugs.openjdk.java.net/browse/JDK-8032211">JDK-8032211</a>.
40 */
41 @ServiceProvider(EventProvider.class)
42 @SuppressWarnings("deprecation")
43 public final class JFREventProvider implements EventProvider {
44
45 private final boolean enabled;
46
47 /**
48 * Need to store the producer in a field so that it doesn't disappear.
49 */
50 @SuppressWarnings("unused") private final com.oracle.jrockit.jfr.Producer producer;
51
52 public JFREventProvider() {
53 enabled = config().flightRecorder;
54 com.oracle.jrockit.jfr.Producer p = null;
55 if (enabled) {
56 try {
57 /*
58 * The "HotSpot JVM" producer is a native producer and we cannot use it. So we
59 * create our own. This has the downside that Mission Control is confused and
60 * doesn't show JVMCI events in the "Code" tab. There are plans to revise the JFR
61 * code for JDK 9.
62 */
63 p = new com.oracle.jrockit.jfr.Producer("HotSpot JVM", "Oracle Hotspot JVM", "http://www.oracle.com/hotspot/jvm/");
64 p.register();
65 // Register event classes with Producer.
66 for (Class<?> c : JFREventProvider.class.getDeclaredClasses()) {
67 if (c.isAnnotationPresent(com.oracle.jrockit.jfr.EventDefinition.class)) {
68 assert com.oracle.jrockit.jfr.InstantEvent.class.isAssignableFrom(c) : c;
69 registerEvent(p, c);
70 }
71 }
72 } catch (URISyntaxException e) {
73 throw new InternalError(e);
74 }
75 }
76 this.producer = p;
77 }
78
79 /**
80 * Register an event class with the {@link com.oracle.jrockit.jfr.Producer}.
81 *
82 * @param c event class
83 * @return the {@link EventToken event token}
84 */
85 @SuppressWarnings({"javadoc", "unchecked"})
86 private static com.oracle.jrockit.jfr.EventToken registerEvent(com.oracle.jrockit.jfr.Producer producer, Class<?> c) {
87 try {
88 return producer.addEvent((Class<? extends com.oracle.jrockit.jfr.InstantEvent>) c);
89 } catch (com.oracle.jrockit.jfr.InvalidEventDefinitionException | com.oracle.jrockit.jfr.InvalidValueException e) {
90 throw new InternalError(e);
91 }
92 }
93
94 public CompilationEvent newCompilationEvent() {
95 if (enabled) {
96 return new JFRCompilationEvent();
97 }
98 return new EmptyCompilationEvent();
99 }
100
101 /**
102 * A JFR compilation event.
103 *
104 * <p>
105 * See: event {@code Compilation} in {@code src/share/vm/trace/trace.xml}
106 */
107 @com.oracle.jrockit.jfr.EventDefinition(name = "Compilation", path = "vm/compiler/compilation")
108 public static class JFRCompilationEvent extends com.oracle.jrockit.jfr.DurationEvent implements CompilationEvent {
109
110 /*
111 * FIXME method should be a Method* but we can't express that in Java.
112 */
113 @com.oracle.jrockit.jfr.ValueDefinition(name = "Java Method") public String method;
114 @com.oracle.jrockit.jfr.ValueDefinition(name = "Compilation ID", relationKey = "COMP_ID") public int compileId;
115 @com.oracle.jrockit.jfr.ValueDefinition(name = "Compilation Level") public short compileLevel;
116 @com.oracle.jrockit.jfr.ValueDefinition(name = "Succeeded") public boolean succeeded;
117 @com.oracle.jrockit.jfr.ValueDefinition(name = "On Stack Replacement") public boolean isOsr;
118 @com.oracle.jrockit.jfr.ValueDefinition(name = "Compiled Code Size", contentType = com.oracle.jrockit.jfr.ContentType.Bytes) public int codeSize;
119 @com.oracle.jrockit.jfr.ValueDefinition(name = "Inlined Code Size", contentType = com.oracle.jrockit.jfr.ContentType.Bytes) public int inlinedBytes;
120
121 public void setMethod(String method) {
122 this.method = method;
123 }
124
125 public void setCompileId(int id) {
126 this.compileId = id;
127 }
128
129 public void setCompileLevel(int compileLevel) {
130 this.compileLevel = (short) compileLevel;
131 }
132
133 public void setSucceeded(boolean succeeded) {
134 this.succeeded = succeeded;
135 }
136
137 public void setIsOsr(boolean isOsr) {
138 this.isOsr = isOsr;
139 }
140
141 public void setCodeSize(int codeSize) {
142 this.codeSize = codeSize;
143 }
144
145 public void setInlinedBytes(int inlinedBytes) {
146 this.inlinedBytes = inlinedBytes;
147 }
148 }
149
150 public CompilerFailureEvent newCompilerFailureEvent() {
151 if (enabled) {
152 return new JFRCompilerFailureEvent();
153 }
154 return new EmptyCompilerFailureEvent();
155 }
156
157 /**
158 * A JFR compiler failure event.
159 *
160 * <p>
161 * See: event {@code CompilerFailure} in {@code src/share/vm/trace/trace.xml}
162 */
163 @com.oracle.jrockit.jfr.EventDefinition(name = "Compilation Failure", path = "vm/compiler/failure")
164 public static class JFRCompilerFailureEvent extends com.oracle.jrockit.jfr.InstantEvent implements CompilerFailureEvent {
165
166 @com.oracle.jrockit.jfr.ValueDefinition(name = "Compilation ID", relationKey = "COMP_ID") public int compileId;
167 @com.oracle.jrockit.jfr.ValueDefinition(name = "Message", description = "The failure message") public String failure;
168
169 public void setCompileId(int id) {
170 this.compileId = id;
171 }
172
173 public void setMessage(String message) {
174 this.failure = message;
175 }
176 }
177
178 }