annotate src/share/vm/prims/jvmtiExport.hpp @ 6862:8a5ea0a9ccc4

7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author johnc
date Sat, 06 Oct 2012 01:17:44 -0700
parents da91efe96a93
children fb19af007ffc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
5935
a735aec54ea4 7123170: JCK vm/jvmti/ResourceExhausted/resexh001/resexh00101/ tests fails since 7u4 b02
sspitsyn
parents: 3939
diff changeset
2 * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1397
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1397
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1397
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
25 #ifndef SHARE_VM_PRIMS_JVMTIEXPORT_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
26 #define SHARE_VM_PRIMS_JVMTIEXPORT_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
28 #include "jvmtifiles/jvmti.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
29 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
30 #include "memory/iterator.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
31 #include "oops/oop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
32 #include "oops/oopsHierarchy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
33 #include "runtime/frame.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
34 #include "runtime/handles.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
35 #include "utilities/globalDefinitions.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
36 #include "utilities/growableArray.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
37
1983
c760f78e0a53 7003125: precompiled.hpp is included when precompiled headers are not used
stefank
parents: 1972
diff changeset
38 // Must be included after jvmti.h.
c760f78e0a53 7003125: precompiled.hpp is included when precompiled headers are not used
stefank
parents: 1972
diff changeset
39 #include "code/jvmticmlr.h"
c760f78e0a53 7003125: precompiled.hpp is included when precompiled headers are not used
stefank
parents: 1972
diff changeset
40
0
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // Forward declarations
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class JvmtiEventControllerPrivate;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class JvmtiManageCapabilities;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 class JvmtiEnv;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 class JvmtiThreadState;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class AttachOperation;
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 #ifndef JVMTI_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
50 #define JVMTI_SUPPORT_FLAG(key) \
a61af66fc99e Initial load
duke
parents:
diff changeset
51 private: \
a61af66fc99e Initial load
duke
parents:
diff changeset
52 static bool _##key; \
a61af66fc99e Initial load
duke
parents:
diff changeset
53 public: \
a61af66fc99e Initial load
duke
parents:
diff changeset
54 inline static void set_##key(bool on) { _##key = (on != 0); } \
a61af66fc99e Initial load
duke
parents:
diff changeset
55 inline static bool key() { return _##key; }
a61af66fc99e Initial load
duke
parents:
diff changeset
56 #else // JVMTI_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
57 #define JVMTI_SUPPORT_FLAG(key) \
a61af66fc99e Initial load
duke
parents:
diff changeset
58 private: \
a61af66fc99e Initial load
duke
parents:
diff changeset
59 const static bool _##key = false; \
a61af66fc99e Initial load
duke
parents:
diff changeset
60 public: \
a61af66fc99e Initial load
duke
parents:
diff changeset
61 inline static void set_##key(bool on) { report_unsupported(on); } \
a61af66fc99e Initial load
duke
parents:
diff changeset
62 inline static bool key() { return _##key; }
a61af66fc99e Initial load
duke
parents:
diff changeset
63 #endif // JVMTI_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // This class contains the JVMTI interface for the rest of hotspot.
a61af66fc99e Initial load
duke
parents:
diff changeset
67 //
a61af66fc99e Initial load
duke
parents:
diff changeset
68 class JvmtiExport : public AllStatic {
3939
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 2301
diff changeset
69 friend class VMStructs;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
70 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
71 static int _field_access_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 static int _field_modification_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 static bool _can_access_local_variables;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 static bool _can_hotswap_or_post_breakpoint;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 static bool _can_modify_any_class;
a61af66fc99e Initial load
duke
parents:
diff changeset
77 static bool _can_walk_any_space;
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 JVMTI_SUPPORT_FLAG(can_get_source_debug_extension)
a61af66fc99e Initial load
duke
parents:
diff changeset
80 JVMTI_SUPPORT_FLAG(can_maintain_original_method_order)
a61af66fc99e Initial load
duke
parents:
diff changeset
81 JVMTI_SUPPORT_FLAG(can_post_interpreter_events)
1213
6deeaebad47a 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 1121
diff changeset
82 JVMTI_SUPPORT_FLAG(can_post_on_exceptions)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 JVMTI_SUPPORT_FLAG(can_post_breakpoint)
a61af66fc99e Initial load
duke
parents:
diff changeset
84 JVMTI_SUPPORT_FLAG(can_post_field_access)
a61af66fc99e Initial load
duke
parents:
diff changeset
85 JVMTI_SUPPORT_FLAG(can_post_field_modification)
a61af66fc99e Initial load
duke
parents:
diff changeset
86 JVMTI_SUPPORT_FLAG(can_post_method_entry)
a61af66fc99e Initial load
duke
parents:
diff changeset
87 JVMTI_SUPPORT_FLAG(can_post_method_exit)
a61af66fc99e Initial load
duke
parents:
diff changeset
88 JVMTI_SUPPORT_FLAG(can_pop_frame)
a61af66fc99e Initial load
duke
parents:
diff changeset
89 JVMTI_SUPPORT_FLAG(can_force_early_return)
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 friend class JvmtiEventControllerPrivate; // should only modify these flags
a61af66fc99e Initial load
duke
parents:
diff changeset
92 JVMTI_SUPPORT_FLAG(should_post_single_step)
a61af66fc99e Initial load
duke
parents:
diff changeset
93 JVMTI_SUPPORT_FLAG(should_post_field_access)
a61af66fc99e Initial load
duke
parents:
diff changeset
94 JVMTI_SUPPORT_FLAG(should_post_field_modification)
a61af66fc99e Initial load
duke
parents:
diff changeset
95 JVMTI_SUPPORT_FLAG(should_post_class_load)
a61af66fc99e Initial load
duke
parents:
diff changeset
96 JVMTI_SUPPORT_FLAG(should_post_class_prepare)
a61af66fc99e Initial load
duke
parents:
diff changeset
97 JVMTI_SUPPORT_FLAG(should_post_class_unload)
a61af66fc99e Initial load
duke
parents:
diff changeset
98 JVMTI_SUPPORT_FLAG(should_post_native_method_bind)
a61af66fc99e Initial load
duke
parents:
diff changeset
99 JVMTI_SUPPORT_FLAG(should_post_compiled_method_load)
a61af66fc99e Initial load
duke
parents:
diff changeset
100 JVMTI_SUPPORT_FLAG(should_post_compiled_method_unload)
a61af66fc99e Initial load
duke
parents:
diff changeset
101 JVMTI_SUPPORT_FLAG(should_post_dynamic_code_generated)
a61af66fc99e Initial load
duke
parents:
diff changeset
102 JVMTI_SUPPORT_FLAG(should_post_monitor_contended_enter)
a61af66fc99e Initial load
duke
parents:
diff changeset
103 JVMTI_SUPPORT_FLAG(should_post_monitor_contended_entered)
a61af66fc99e Initial load
duke
parents:
diff changeset
104 JVMTI_SUPPORT_FLAG(should_post_monitor_wait)
a61af66fc99e Initial load
duke
parents:
diff changeset
105 JVMTI_SUPPORT_FLAG(should_post_monitor_waited)
a61af66fc99e Initial load
duke
parents:
diff changeset
106 JVMTI_SUPPORT_FLAG(should_post_data_dump)
a61af66fc99e Initial load
duke
parents:
diff changeset
107 JVMTI_SUPPORT_FLAG(should_post_garbage_collection_start)
a61af66fc99e Initial load
duke
parents:
diff changeset
108 JVMTI_SUPPORT_FLAG(should_post_garbage_collection_finish)
1213
6deeaebad47a 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 1121
diff changeset
109 JVMTI_SUPPORT_FLAG(should_post_on_exceptions)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // ------ the below maybe don't have to be (but are for now)
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // fixed conditions here ------------
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // any events can be enabled
a61af66fc99e Initial load
duke
parents:
diff changeset
114 JVMTI_SUPPORT_FLAG(should_post_thread_life)
a61af66fc99e Initial load
duke
parents:
diff changeset
115 JVMTI_SUPPORT_FLAG(should_post_object_free)
a61af66fc99e Initial load
duke
parents:
diff changeset
116 JVMTI_SUPPORT_FLAG(should_post_resource_exhausted)
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // we are holding objects on the heap - need to talk to GC - e.g.
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // breakpoint info
a61af66fc99e Initial load
duke
parents:
diff changeset
120 JVMTI_SUPPORT_FLAG(should_clean_up_heap_objects)
a61af66fc99e Initial load
duke
parents:
diff changeset
121 JVMTI_SUPPORT_FLAG(should_post_vm_object_alloc)
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // If flag cannot be implemented, give an error if on=true
a61af66fc99e Initial load
duke
parents:
diff changeset
124 static void report_unsupported(bool on);
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // these should only be called by the friend class
a61af66fc99e Initial load
duke
parents:
diff changeset
127 friend class JvmtiManageCapabilities;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 inline static void set_can_modify_any_class(bool on) { _can_modify_any_class = (on != 0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 inline static void set_can_access_local_variables(bool on) { _can_access_local_variables = (on != 0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
130 inline static void set_can_hotswap_or_post_breakpoint(bool on) { _can_hotswap_or_post_breakpoint = (on != 0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
131 inline static void set_can_walk_any_space(bool on) { _can_walk_any_space = (on != 0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 JVMTI_VERSION_MASK = 0x70000000,
a61af66fc99e Initial load
duke
parents:
diff changeset
135 JVMTI_VERSION_VALUE = 0x30000000,
a61af66fc99e Initial load
duke
parents:
diff changeset
136 JVMDI_VERSION_VALUE = 0x20000000
a61af66fc99e Initial load
duke
parents:
diff changeset
137 };
a61af66fc99e Initial load
duke
parents:
diff changeset
138
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
139 static void post_field_modification(JavaThread *thread, Method* method, address location,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
140 KlassHandle field_klass, Handle object, jfieldID field,
a61af66fc99e Initial load
duke
parents:
diff changeset
141 char sig_type, jvalue *value);
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // posts a DynamicCodeGenerated event (internal/private implementation).
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // The public post_dynamic_code_generated* functions make use of the
2301
f91db74a6810 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 2195
diff changeset
146 // internal implementation. Also called from JvmtiDeferredEvent::post()
0
a61af66fc99e Initial load
duke
parents:
diff changeset
147 static void post_dynamic_code_generated_internal(const char *name, const void *code_begin, const void *code_end) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
148
2301
f91db74a6810 7017640: Fix for 6766644 deadlocks on some NSK tests when running with -Xcomp
kamg
parents: 2195
diff changeset
149 private:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // GenerateEvents support to allow posting of CompiledMethodLoad and
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // DynamicCodeGenerated events for a given environment.
a61af66fc99e Initial load
duke
parents:
diff changeset
153 friend class JvmtiCodeBlobEvents;
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 static void post_compiled_method_load(JvmtiEnv* env, const jmethodID method, const jint length,
a61af66fc99e Initial load
duke
parents:
diff changeset
156 const void *code_begin, const jint map_length,
a61af66fc99e Initial load
duke
parents:
diff changeset
157 const jvmtiAddrLocationMap* map) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 static void post_dynamic_code_generated(JvmtiEnv* env, const char *name, const void *code_begin,
a61af66fc99e Initial load
duke
parents:
diff changeset
159 const void *code_end) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // The RedefineClasses() API breaks some invariants in the "regular"
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // system. For example, there are sanity checks when GC'ing nmethods
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // that require the containing class to be unloading. However, when a
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // method is redefined, the old method and nmethod can become GC'able
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // without the containing class unloading. The state of becoming
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // GC'able can be asynchronous to the RedefineClasses() call since
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // the old method may still be running and cannot be GC'ed until
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // after all old invocations have finished. Additionally, a method
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // that has not been redefined may have an nmethod that depends on
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // the redefined method. The dependent nmethod will get deopted in
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // this case and may also be GC'able without the containing class
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // being unloaded.
a61af66fc99e Initial load
duke
parents:
diff changeset
173 //
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // This flag indicates whether RedefineClasses() has ever redefined
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // one or more classes during the lifetime of the VM. The flag should
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // only be set by the friend class and can be queried by other sub
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // systems as needed to relax invariant checks.
a61af66fc99e Initial load
duke
parents:
diff changeset
178 static bool _has_redefined_a_class;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 friend class VM_RedefineClasses;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 inline static void set_has_redefined_a_class() {
a61af66fc99e Initial load
duke
parents:
diff changeset
181 _has_redefined_a_class = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // Flag to indicate if the compiler has recorded all dependencies. When the
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // can_redefine_classes capability is enabled in the OnLoad phase then the compiler
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // records all dependencies from startup. However if the capability is first
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // enabled some time later then the dependencies recorded by the compiler
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // are incomplete. This flag is used by RedefineClasses to know if the
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // dependency information is complete or not.
a61af66fc99e Initial load
duke
parents:
diff changeset
190 static bool _all_dependencies_are_recorded;
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
193 inline static bool has_redefined_a_class() {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 return _has_redefined_a_class;
a61af66fc99e Initial load
duke
parents:
diff changeset
195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 inline static bool all_dependencies_are_recorded() {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 return _all_dependencies_are_recorded;
a61af66fc99e Initial load
duke
parents:
diff changeset
199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 inline static void set_all_dependencies_are_recorded(bool on) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 _all_dependencies_are_recorded = (on != 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // let JVMTI know that the JVM_OnLoad code is running
a61af66fc99e Initial load
duke
parents:
diff changeset
207 static void enter_onload_phase();
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // let JVMTI know that the VM isn't up yet (and JVM_OnLoad code isn't running)
a61af66fc99e Initial load
duke
parents:
diff changeset
210 static void enter_primordial_phase();
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // let JVMTI know that the VM isn't up yet but JNI is live
a61af66fc99e Initial load
duke
parents:
diff changeset
213 static void enter_start_phase();
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // let JVMTI know that the VM is fully up and running now
a61af66fc99e Initial load
duke
parents:
diff changeset
216 static void enter_live_phase();
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // ------ can_* conditions (below) are set at OnLoad and never changed ------------
a61af66fc99e Initial load
duke
parents:
diff changeset
219 inline static bool can_modify_any_class() { return _can_modify_any_class; }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 inline static bool can_access_local_variables() { return _can_access_local_variables; }
a61af66fc99e Initial load
duke
parents:
diff changeset
221 inline static bool can_hotswap_or_post_breakpoint() { return _can_hotswap_or_post_breakpoint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 inline static bool can_walk_any_space() { return _can_walk_any_space; }
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // field access management
a61af66fc99e Initial load
duke
parents:
diff changeset
225 static address get_field_access_count_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // field modification management
a61af66fc99e Initial load
duke
parents:
diff changeset
228 static address get_field_modification_count_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // -----------------
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 static bool is_jvmti_version(jint version) { return (version & JVMTI_VERSION_MASK) == JVMTI_VERSION_VALUE; }
a61af66fc99e Initial load
duke
parents:
diff changeset
233 static bool is_jvmdi_version(jint version) { return (version & JVMTI_VERSION_MASK) == JVMDI_VERSION_VALUE; }
a61af66fc99e Initial load
duke
parents:
diff changeset
234 static jint get_jvmti_interface(JavaVM *jvm, void **penv, jint version);
1121
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 0
diff changeset
235 static void decode_version_values(jint version, int * major, int * minor,
98cd9901c161 6849968: 3/2 JVMTI tests fails on jdk5.0 with hs14
dcubed
parents: 0
diff changeset
236 int * micro);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // single stepping management methods
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
239 static void at_single_stepping_point(JavaThread *thread, Method* method, address location) KERNEL_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
240 static void expose_single_stepping(JavaThread *thread) KERNEL_RETURN;
2195
bf8517f4e4d0 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 2177
diff changeset
241 static bool hide_single_stepping(JavaThread *thread) KERNEL_RETURN_(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // Methods that notify the debugger that something interesting has happened in the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
244 static void post_vm_start ();
a61af66fc99e Initial load
duke
parents:
diff changeset
245 static void post_vm_initialized ();
a61af66fc99e Initial load
duke
parents:
diff changeset
246 static void post_vm_death ();
a61af66fc99e Initial load
duke
parents:
diff changeset
247
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
248 static void post_single_step (JavaThread *thread, Method* method, address location) KERNEL_RETURN;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
249 static void post_raw_breakpoint (JavaThread *thread, Method* method, address location) KERNEL_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
250
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
251 static void post_exception_throw (JavaThread *thread, Method* method, address location, oop exception) KERNEL_RETURN;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
252 static void notice_unwind_due_to_exception (JavaThread *thread, Method* method, address location, oop exception, bool in_handler_frame) KERNEL_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 static oop jni_GetField_probe (JavaThread *thread, jobject jobj,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
255 oop obj, Klass* klass, jfieldID fieldID, bool is_static)
2195
bf8517f4e4d0 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 2177
diff changeset
256 KERNEL_RETURN_(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
257 static oop jni_GetField_probe_nh (JavaThread *thread, jobject jobj,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
258 oop obj, Klass* klass, jfieldID fieldID, bool is_static)
2195
bf8517f4e4d0 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 2177
diff changeset
259 KERNEL_RETURN_(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
260 static void post_field_access_by_jni (JavaThread *thread, oop obj,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
261 Klass* klass, jfieldID fieldID, bool is_static) KERNEL_RETURN;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
262 static void post_field_access (JavaThread *thread, Method* method,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
263 address location, KlassHandle field_klass, Handle object, jfieldID field) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 static oop jni_SetField_probe (JavaThread *thread, jobject jobj,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
265 oop obj, Klass* klass, jfieldID fieldID, bool is_static, char sig_type,
2195
bf8517f4e4d0 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 2177
diff changeset
266 jvalue *value) KERNEL_RETURN_(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
267 static oop jni_SetField_probe_nh (JavaThread *thread, jobject jobj,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
268 oop obj, Klass* klass, jfieldID fieldID, bool is_static, char sig_type,
2195
bf8517f4e4d0 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 2177
diff changeset
269 jvalue *value) KERNEL_RETURN_(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
270 static void post_field_modification_by_jni(JavaThread *thread, oop obj,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
271 Klass* klass, jfieldID fieldID, bool is_static, char sig_type,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
272 jvalue *value);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
273 static void post_raw_field_modification(JavaThread *thread, Method* method,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
274 address location, KlassHandle field_klass, Handle object, jfieldID field,
a61af66fc99e Initial load
duke
parents:
diff changeset
275 char sig_type, jvalue *value) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
276
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
277 static void post_method_entry (JavaThread *thread, Method* method, frame current_frame) KERNEL_RETURN;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
278 static void post_method_exit (JavaThread *thread, Method* method, frame current_frame) KERNEL_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
279
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
280 static void post_class_load (JavaThread *thread, Klass* klass) KERNEL_RETURN;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
281 static void post_class_unload (Klass* klass) KERNEL_RETURN;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
282 static void post_class_prepare (JavaThread *thread, Klass* klass) KERNEL_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 static void post_thread_start (JavaThread *thread) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 static void post_thread_end (JavaThread *thread) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // Support for java.lang.instrument agent loading.
a61af66fc99e Initial load
duke
parents:
diff changeset
288 static bool _should_post_class_file_load_hook;
a61af66fc99e Initial load
duke
parents:
diff changeset
289 inline static void set_should_post_class_file_load_hook(bool on) { _should_post_class_file_load_hook = on; }
a61af66fc99e Initial load
duke
parents:
diff changeset
290 inline static bool should_post_class_file_load_hook() { return _should_post_class_file_load_hook; }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2147
diff changeset
291 static void post_class_file_load_hook(Symbol* h_name, Handle class_loader,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
292 Handle h_protection_domain,
a61af66fc99e Initial load
duke
parents:
diff changeset
293 unsigned char **data_ptr, unsigned char **end_ptr,
a61af66fc99e Initial load
duke
parents:
diff changeset
294 unsigned char **cached_data_ptr,
a61af66fc99e Initial load
duke
parents:
diff changeset
295 jint *cached_length_ptr);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
296 static void post_native_method_bind(Method* method, address* function_ptr) KERNEL_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
297 static void post_compiled_method_load(nmethod *nm) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
298 static void post_dynamic_code_generated(const char *name, const void *code_begin, const void *code_end) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
299
1577
852d0157c696 6956931: assert(SafepointSynchronize::is_at_safepoint()) failed: must be executed at a safepoint
never
parents: 1397
diff changeset
300 // used to post a CompiledMethodUnload event
852d0157c696 6956931: assert(SafepointSynchronize::is_at_safepoint()) failed: must be executed at a safepoint
never
parents: 1397
diff changeset
301 static void post_compiled_method_unload(jmethodID mid, const void *code_begin) KERNEL_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // similiar to post_dynamic_code_generated except that it can be used to
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // post a DynamicCodeGenerated event while holding locks in the VM. Any event
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // posted using this function is recorded by the enclosing event collector
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // -- JvmtiDynamicCodeEventCollector.
a61af66fc99e Initial load
duke
parents:
diff changeset
307 static void post_dynamic_code_generated_while_holding_locks(const char* name, address code_begin, address code_end) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 static void post_garbage_collection_finish() KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
310 static void post_garbage_collection_start() KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
311 static void post_data_dump() KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 static void post_monitor_contended_enter(JavaThread *thread, ObjectMonitor *obj_mntr) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
313 static void post_monitor_contended_entered(JavaThread *thread, ObjectMonitor *obj_mntr) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
314 static void post_monitor_wait(JavaThread *thread, oop obj, jlong timeout) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 static void post_monitor_waited(JavaThread *thread, ObjectMonitor *obj_mntr, jboolean timed_out) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
316 static void post_object_free(JvmtiEnv* env, jlong tag) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 static void post_resource_exhausted(jint resource_exhausted_flags, const char* detail) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
318 static void record_vm_internal_object_allocation(oop object) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // Post objects collected by vm_object_alloc_event_collector.
a61af66fc99e Initial load
duke
parents:
diff changeset
320 static void post_vm_object_alloc(JavaThread *thread, oop object) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // Collects vm internal objects for later event posting.
a61af66fc99e Initial load
duke
parents:
diff changeset
322 inline static void vm_object_alloc_event_collector(oop object) {
a61af66fc99e Initial load
duke
parents:
diff changeset
323 if (should_post_vm_object_alloc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
324 record_vm_internal_object_allocation(object);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }
5935
a735aec54ea4 7123170: JCK vm/jvmti/ResourceExhausted/resexh001/resexh00101/ tests fails since 7u4 b02
sspitsyn
parents: 3939
diff changeset
327 inline static void post_array_size_exhausted() {
a735aec54ea4 7123170: JCK vm/jvmti/ResourceExhausted/resexh001/resexh00101/ tests fails since 7u4 b02
sspitsyn
parents: 3939
diff changeset
328 if (should_post_resource_exhausted()) {
a735aec54ea4 7123170: JCK vm/jvmti/ResourceExhausted/resexh001/resexh00101/ tests fails since 7u4 b02
sspitsyn
parents: 3939
diff changeset
329 post_resource_exhausted(JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR,
a735aec54ea4 7123170: JCK vm/jvmti/ResourceExhausted/resexh001/resexh00101/ tests fails since 7u4 b02
sspitsyn
parents: 3939
diff changeset
330 "Requested array size exceeds VM limit");
a735aec54ea4 7123170: JCK vm/jvmti/ResourceExhausted/resexh001/resexh00101/ tests fails since 7u4 b02
sspitsyn
parents: 3939
diff changeset
331 }
a735aec54ea4 7123170: JCK vm/jvmti/ResourceExhausted/resexh001/resexh00101/ tests fails since 7u4 b02
sspitsyn
parents: 3939
diff changeset
332 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 static void cleanup_thread (JavaThread* thread) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 static void oops_do(OopClosure* f) KERNEL_RETURN;
2147
9afee0b9fc1d 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 2125
diff changeset
337 static void weak_oops_do(BoolObjectClosure* b, OopClosure* f) KERNEL_RETURN;
9afee0b9fc1d 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 2125
diff changeset
338 static void gc_epilogue() KERNEL_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340 static void transition_pending_onload_raw_monitors() KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 #ifndef SERVICES_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // attach support
a61af66fc99e Initial load
duke
parents:
diff changeset
344 static jint load_agent_library(AttachOperation* op, outputStream* out);
a61af66fc99e Initial load
duke
parents:
diff changeset
345 #endif // SERVICES_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // SetNativeMethodPrefix support
a61af66fc99e Initial load
duke
parents:
diff changeset
348 static char** get_all_native_method_prefixes(int* count_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 };
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // Support class used by JvmtiDynamicCodeEventCollector and others. It
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // describes a single code blob by name and address range.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 5935
diff changeset
353 class JvmtiCodeBlobDesc : public CHeapObj<mtInternal> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
354 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
355 char _name[64];
a61af66fc99e Initial load
duke
parents:
diff changeset
356 address _code_begin;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 address _code_end;
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
360 JvmtiCodeBlobDesc(const char *name, address code_begin, address code_end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
361 assert(name != NULL, "all code blobs must be named");
a61af66fc99e Initial load
duke
parents:
diff changeset
362 strncpy(_name, name, sizeof(_name));
a61af66fc99e Initial load
duke
parents:
diff changeset
363 _name[sizeof(_name)-1] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
364 _code_begin = code_begin;
a61af66fc99e Initial load
duke
parents:
diff changeset
365 _code_end = code_end;
a61af66fc99e Initial load
duke
parents:
diff changeset
366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
367 char* name() { return _name; }
a61af66fc99e Initial load
duke
parents:
diff changeset
368 address code_begin() { return _code_begin; }
a61af66fc99e Initial load
duke
parents:
diff changeset
369 address code_end() { return _code_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
370 };
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // JvmtiEventCollector is a helper class to setup thread for
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // event collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
374 class JvmtiEventCollector : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
375 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
376 JvmtiEventCollector* _prev; // Save previous one to support nested event collector.
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
379 void setup_jvmti_thread_state(); // Set this collector in current thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
380 void unset_jvmti_thread_state(); // Reset previous collector in current thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
381 virtual bool is_dynamic_code_event() { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
382 virtual bool is_vm_object_alloc_event(){ return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
383 JvmtiEventCollector *get_prev() { return _prev; }
a61af66fc99e Initial load
duke
parents:
diff changeset
384 };
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // A JvmtiDynamicCodeEventCollector is a helper class for the JvmtiExport
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // interface. It collects "dynamic code generated" events that are posted
a61af66fc99e Initial load
duke
parents:
diff changeset
388 // while holding locks. When the event collector goes out of scope the
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // events will be posted.
a61af66fc99e Initial load
duke
parents:
diff changeset
390 //
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // Usage :-
a61af66fc99e Initial load
duke
parents:
diff changeset
392 //
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // {
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // JvmtiDynamicCodeEventCollector event_collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // :
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // { MutexLocker ml(...)
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // :
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // JvmtiExport::post_dynamic_code_generated_while_holding_locks(...)
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // // event collector goes out of scope => post events to profiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403 class JvmtiDynamicCodeEventCollector : public JvmtiEventCollector {
a61af66fc99e Initial load
duke
parents:
diff changeset
404 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
405 GrowableArray<JvmtiCodeBlobDesc*>* _code_blobs; // collected code blob events
a61af66fc99e Initial load
duke
parents:
diff changeset
406
a61af66fc99e Initial load
duke
parents:
diff changeset
407 friend class JvmtiExport;
a61af66fc99e Initial load
duke
parents:
diff changeset
408 void register_stub(const char* name, address start, address end);
a61af66fc99e Initial load
duke
parents:
diff changeset
409
a61af66fc99e Initial load
duke
parents:
diff changeset
410 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
411 JvmtiDynamicCodeEventCollector() KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
412 ~JvmtiDynamicCodeEventCollector() KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
413 bool is_dynamic_code_event() { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 };
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // Used to record vm internally allocated object oops and post
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // vm object alloc event for objects visible to java world.
a61af66fc99e Initial load
duke
parents:
diff changeset
419 // Constructor enables JvmtiThreadState flag and all vm allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
420 // objects are recorded in a growable array. When destructor is
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // called the vm object alloc event is posted for each objects
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // visible to java world.
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // See jvm.cpp file for its usage.
a61af66fc99e Initial load
duke
parents:
diff changeset
424 //
a61af66fc99e Initial load
duke
parents:
diff changeset
425 class JvmtiVMObjectAllocEventCollector : public JvmtiEventCollector {
a61af66fc99e Initial load
duke
parents:
diff changeset
426 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
427 GrowableArray<oop>* _allocated; // field to record vm internally allocated object oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
428 bool _enable; // This flag is enabled in constructor and disabled
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // in destructor before posting event. To avoid
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // collection of objects allocated while running java code inside
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // agent post_vm_object_alloc() event handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 //GC support
a61af66fc99e Initial load
duke
parents:
diff changeset
434 void oops_do(OopClosure* f);
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436 friend class JvmtiExport;
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // Record vm allocated object oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
438 inline void record_allocation(oop obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440 //GC support
a61af66fc99e Initial load
duke
parents:
diff changeset
441 static void oops_do_for_all_threads(OopClosure* f);
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
444 JvmtiVMObjectAllocEventCollector() KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
445 ~JvmtiVMObjectAllocEventCollector() KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
446 bool is_vm_object_alloc_event() { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
447
a61af66fc99e Initial load
duke
parents:
diff changeset
448 bool is_enabled() { return _enable; }
a61af66fc99e Initial load
duke
parents:
diff changeset
449 void set_enabled(bool on) { _enable = on; }
a61af66fc99e Initial load
duke
parents:
diff changeset
450 };
a61af66fc99e Initial load
duke
parents:
diff changeset
451
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // Marker class to disable the posting of VMObjectAlloc events
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // within its scope.
a61af66fc99e Initial load
duke
parents:
diff changeset
456 //
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // Usage :-
a61af66fc99e Initial load
duke
parents:
diff changeset
458 //
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // {
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // NoJvmtiVMObjectAllocMark njm;
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // :
a61af66fc99e Initial load
duke
parents:
diff changeset
462 // // VMObjAlloc event will not be posted
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // JvmtiExport::vm_object_alloc_event_collector(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // :
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467 class NoJvmtiVMObjectAllocMark : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
468 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // enclosing collector if enabled, NULL otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
470 JvmtiVMObjectAllocEventCollector *_collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
471
a61af66fc99e Initial load
duke
parents:
diff changeset
472 bool was_enabled() { return _collector != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
475 NoJvmtiVMObjectAllocMark() KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
476 ~NoJvmtiVMObjectAllocMark() KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
477 };
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 // Base class for reporting GC events to JVMTI.
a61af66fc99e Initial load
duke
parents:
diff changeset
481 class JvmtiGCMarker : public StackObj {
2125
7246a374a9f2 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 1983
diff changeset
482 public:
7246a374a9f2 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 1983
diff changeset
483 JvmtiGCMarker() KERNEL_RETURN;
7246a374a9f2 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 1983
diff changeset
484 ~JvmtiGCMarker() KERNEL_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
485 };
a61af66fc99e Initial load
duke
parents:
diff changeset
486
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // JvmtiHideSingleStepping is a helper class for hiding
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // internal single step events.
a61af66fc99e Initial load
duke
parents:
diff changeset
489 class JvmtiHideSingleStepping : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
490 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
491 bool _single_step_hidden;
a61af66fc99e Initial load
duke
parents:
diff changeset
492 JavaThread * _thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
495 JvmtiHideSingleStepping(JavaThread * thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
496 assert(thread != NULL, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 _single_step_hidden = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
499 _thread = thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
500 if (JvmtiExport::should_post_single_step()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
501 _single_step_hidden = JvmtiExport::hide_single_stepping(_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
502 }
a61af66fc99e Initial load
duke
parents:
diff changeset
503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505 ~JvmtiHideSingleStepping() {
a61af66fc99e Initial load
duke
parents:
diff changeset
506 if (_single_step_hidden) {
a61af66fc99e Initial load
duke
parents:
diff changeset
507 JvmtiExport::expose_single_stepping(_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
509 }
a61af66fc99e Initial load
duke
parents:
diff changeset
510 };
a61af66fc99e Initial load
duke
parents:
diff changeset
511
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
512 #endif // SHARE_VM_PRIMS_JVMTIEXPORT_HPP