Mercurial > hg > graal-jvmci-8
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 } |