202 _all_dependencies_are_recorded = (on != 0); |
210 _all_dependencies_are_recorded = (on != 0); |
203 } |
211 } |
204 |
212 |
205 |
213 |
206 // let JVMTI know that the JVM_OnLoad code is running |
214 // let JVMTI know that the JVM_OnLoad code is running |
207 static void enter_onload_phase(); |
215 static void enter_onload_phase() NOT_JVMTI_RETURN; |
208 |
216 |
209 // let JVMTI know that the VM isn't up yet (and JVM_OnLoad code isn't running) |
217 // let JVMTI know that the VM isn't up yet (and JVM_OnLoad code isn't running) |
210 static void enter_primordial_phase(); |
218 static void enter_primordial_phase() NOT_JVMTI_RETURN; |
211 |
219 |
212 // let JVMTI know that the VM isn't up yet but JNI is live |
220 // let JVMTI know that the VM isn't up yet but JNI is live |
213 static void enter_start_phase(); |
221 static void enter_start_phase() NOT_JVMTI_RETURN; |
214 |
222 |
215 // let JVMTI know that the VM is fully up and running now |
223 // let JVMTI know that the VM is fully up and running now |
216 static void enter_live_phase(); |
224 static void enter_live_phase() NOT_JVMTI_RETURN; |
217 |
225 |
218 // ------ can_* conditions (below) are set at OnLoad and never changed ------------ |
226 // ------ can_* conditions (below) are set at OnLoad and never changed ------------ |
219 inline static bool can_modify_any_class() { return _can_modify_any_class; } |
227 inline static bool can_modify_any_class() { |
220 inline static bool can_access_local_variables() { return _can_access_local_variables; } |
228 JVMTI_ONLY(return _can_modify_any_class); |
221 inline static bool can_hotswap_or_post_breakpoint() { return _can_hotswap_or_post_breakpoint; } |
229 NOT_JVMTI(return false); |
222 inline static bool can_walk_any_space() { return _can_walk_any_space; } |
230 } |
|
231 inline static bool can_access_local_variables() { |
|
232 JVMTI_ONLY(return _can_access_local_variables); |
|
233 NOT_JVMTI(return false); |
|
234 } |
|
235 inline static bool can_hotswap_or_post_breakpoint() { |
|
236 JVMTI_ONLY(return _can_hotswap_or_post_breakpoint); |
|
237 NOT_JVMTI(return false); |
|
238 } |
|
239 inline static bool can_walk_any_space() { |
|
240 JVMTI_ONLY(return _can_walk_any_space); |
|
241 NOT_JVMTI(return false); |
|
242 } |
223 |
243 |
224 // field access management |
244 // field access management |
225 static address get_field_access_count_addr(); |
245 static address get_field_access_count_addr() NOT_JVMTI_RETURN_(0); |
226 |
246 |
227 // field modification management |
247 // field modification management |
228 static address get_field_modification_count_addr(); |
248 static address get_field_modification_count_addr() NOT_JVMTI_RETURN_(0); |
229 |
249 |
230 // ----------------- |
250 // ----------------- |
231 |
251 |
232 static bool is_jvmti_version(jint version) { return (version & JVMTI_VERSION_MASK) == JVMTI_VERSION_VALUE; } |
252 static bool is_jvmti_version(jint version) { |
233 static bool is_jvmdi_version(jint version) { return (version & JVMTI_VERSION_MASK) == JVMDI_VERSION_VALUE; } |
253 JVMTI_ONLY(return (version & JVMTI_VERSION_MASK) == JVMTI_VERSION_VALUE); |
234 static jint get_jvmti_interface(JavaVM *jvm, void **penv, jint version); |
254 NOT_JVMTI(return false); |
|
255 } |
|
256 static bool is_jvmdi_version(jint version) { |
|
257 JVMTI_ONLY(return (version & JVMTI_VERSION_MASK) == JVMDI_VERSION_VALUE); |
|
258 NOT_JVMTI(return false); |
|
259 } |
|
260 static jint get_jvmti_interface(JavaVM *jvm, void **penv, jint version) NOT_JVMTI_RETURN_(0); |
235 static void decode_version_values(jint version, int * major, int * minor, |
261 static void decode_version_values(jint version, int * major, int * minor, |
236 int * micro); |
262 int * micro) NOT_JVMTI_RETURN; |
237 |
263 |
238 // single stepping management methods |
264 // single stepping management methods |
239 static void at_single_stepping_point(JavaThread *thread, Method* method, address location) KERNEL_RETURN; |
265 static void at_single_stepping_point(JavaThread *thread, Method* method, address location) NOT_JVMTI_RETURN; |
240 static void expose_single_stepping(JavaThread *thread) KERNEL_RETURN; |
266 static void expose_single_stepping(JavaThread *thread) NOT_JVMTI_RETURN; |
241 static bool hide_single_stepping(JavaThread *thread) KERNEL_RETURN_(false); |
267 static bool hide_single_stepping(JavaThread *thread) NOT_JVMTI_RETURN_(false); |
242 |
268 |
243 // Methods that notify the debugger that something interesting has happened in the VM. |
269 // Methods that notify the debugger that something interesting has happened in the VM. |
244 static void post_vm_start (); |
270 static void post_vm_start () NOT_JVMTI_RETURN; |
245 static void post_vm_initialized (); |
271 static void post_vm_initialized () NOT_JVMTI_RETURN; |
246 static void post_vm_death (); |
272 static void post_vm_death () NOT_JVMTI_RETURN; |
247 |
273 |
248 static void post_single_step (JavaThread *thread, Method* method, address location) KERNEL_RETURN; |
274 static void post_single_step (JavaThread *thread, Method* method, address location) NOT_JVMTI_RETURN; |
249 static void post_raw_breakpoint (JavaThread *thread, Method* method, address location) KERNEL_RETURN; |
275 static void post_raw_breakpoint (JavaThread *thread, Method* method, address location) NOT_JVMTI_RETURN; |
250 |
276 |
251 static void post_exception_throw (JavaThread *thread, Method* method, address location, oop exception) KERNEL_RETURN; |
277 static void post_exception_throw (JavaThread *thread, Method* method, address location, oop exception) NOT_JVMTI_RETURN; |
252 static void notice_unwind_due_to_exception (JavaThread *thread, Method* method, address location, oop exception, bool in_handler_frame) KERNEL_RETURN; |
278 static void notice_unwind_due_to_exception (JavaThread *thread, Method* method, address location, oop exception, bool in_handler_frame) NOT_JVMTI_RETURN; |
253 |
279 |
254 static oop jni_GetField_probe (JavaThread *thread, jobject jobj, |
280 static oop jni_GetField_probe (JavaThread *thread, jobject jobj, |
255 oop obj, Klass* klass, jfieldID fieldID, bool is_static) |
281 oop obj, Klass* klass, jfieldID fieldID, bool is_static) |
256 KERNEL_RETURN_(NULL); |
282 NOT_JVMTI_RETURN_(NULL); |
257 static oop jni_GetField_probe_nh (JavaThread *thread, jobject jobj, |
283 static oop jni_GetField_probe_nh (JavaThread *thread, jobject jobj, |
258 oop obj, Klass* klass, jfieldID fieldID, bool is_static) |
284 oop obj, Klass* klass, jfieldID fieldID, bool is_static) |
259 KERNEL_RETURN_(NULL); |
285 NOT_JVMTI_RETURN_(NULL); |
260 static void post_field_access_by_jni (JavaThread *thread, oop obj, |
286 static void post_field_access_by_jni (JavaThread *thread, oop obj, |
261 Klass* klass, jfieldID fieldID, bool is_static) KERNEL_RETURN; |
287 Klass* klass, jfieldID fieldID, bool is_static) NOT_JVMTI_RETURN; |
262 static void post_field_access (JavaThread *thread, Method* method, |
288 static void post_field_access (JavaThread *thread, Method* method, |
263 address location, KlassHandle field_klass, Handle object, jfieldID field) KERNEL_RETURN; |
289 address location, KlassHandle field_klass, Handle object, jfieldID field) NOT_JVMTI_RETURN; |
264 static oop jni_SetField_probe (JavaThread *thread, jobject jobj, |
290 static oop jni_SetField_probe (JavaThread *thread, jobject jobj, |
265 oop obj, Klass* klass, jfieldID fieldID, bool is_static, char sig_type, |
291 oop obj, Klass* klass, jfieldID fieldID, bool is_static, char sig_type, |
266 jvalue *value) KERNEL_RETURN_(NULL); |
292 jvalue *value) NOT_JVMTI_RETURN_(NULL); |
267 static oop jni_SetField_probe_nh (JavaThread *thread, jobject jobj, |
293 static oop jni_SetField_probe_nh (JavaThread *thread, jobject jobj, |
268 oop obj, Klass* klass, jfieldID fieldID, bool is_static, char sig_type, |
294 oop obj, Klass* klass, jfieldID fieldID, bool is_static, char sig_type, |
269 jvalue *value) KERNEL_RETURN_(NULL); |
295 jvalue *value) NOT_JVMTI_RETURN_(NULL); |
270 static void post_field_modification_by_jni(JavaThread *thread, oop obj, |
296 static void post_field_modification_by_jni(JavaThread *thread, oop obj, |
271 Klass* klass, jfieldID fieldID, bool is_static, char sig_type, |
297 Klass* klass, jfieldID fieldID, bool is_static, char sig_type, |
272 jvalue *value); |
298 jvalue *value); |
273 static void post_raw_field_modification(JavaThread *thread, Method* method, |
299 static void post_raw_field_modification(JavaThread *thread, Method* method, |
274 address location, KlassHandle field_klass, Handle object, jfieldID field, |
300 address location, KlassHandle field_klass, Handle object, jfieldID field, |
275 char sig_type, jvalue *value) KERNEL_RETURN; |
301 char sig_type, jvalue *value) NOT_JVMTI_RETURN; |
276 |
302 |
277 static void post_method_entry (JavaThread *thread, Method* method, frame current_frame) KERNEL_RETURN; |
303 static void post_method_entry (JavaThread *thread, Method* method, frame current_frame) NOT_JVMTI_RETURN; |
278 static void post_method_exit (JavaThread *thread, Method* method, frame current_frame) KERNEL_RETURN; |
304 static void post_method_exit (JavaThread *thread, Method* method, frame current_frame) NOT_JVMTI_RETURN; |
279 |
305 |
280 static void post_class_load (JavaThread *thread, Klass* klass) KERNEL_RETURN; |
306 static void post_class_load (JavaThread *thread, Klass* klass) NOT_JVMTI_RETURN; |
281 static void post_class_unload (Klass* klass) KERNEL_RETURN; |
307 static void post_class_unload (Klass* klass) NOT_JVMTI_RETURN; |
282 static void post_class_prepare (JavaThread *thread, Klass* klass) KERNEL_RETURN; |
308 static void post_class_prepare (JavaThread *thread, Klass* klass) NOT_JVMTI_RETURN; |
283 |
309 |
284 static void post_thread_start (JavaThread *thread) KERNEL_RETURN; |
310 static void post_thread_start (JavaThread *thread) NOT_JVMTI_RETURN; |
285 static void post_thread_end (JavaThread *thread) KERNEL_RETURN; |
311 static void post_thread_end (JavaThread *thread) NOT_JVMTI_RETURN; |
286 |
312 |
287 // Support for java.lang.instrument agent loading. |
313 // Support for java.lang.instrument agent loading. |
288 static bool _should_post_class_file_load_hook; |
314 static bool _should_post_class_file_load_hook; |
289 inline static void set_should_post_class_file_load_hook(bool on) { _should_post_class_file_load_hook = on; } |
315 inline static void set_should_post_class_file_load_hook(bool on) { _should_post_class_file_load_hook = on; } |
290 inline static bool should_post_class_file_load_hook() { return _should_post_class_file_load_hook; } |
316 inline static bool should_post_class_file_load_hook() { |
|
317 JVMTI_ONLY(return _should_post_class_file_load_hook); |
|
318 NOT_JVMTI(return false;) |
|
319 } |
291 static void post_class_file_load_hook(Symbol* h_name, Handle class_loader, |
320 static void post_class_file_load_hook(Symbol* h_name, Handle class_loader, |
292 Handle h_protection_domain, |
321 Handle h_protection_domain, |
293 unsigned char **data_ptr, unsigned char **end_ptr, |
322 unsigned char **data_ptr, unsigned char **end_ptr, |
294 unsigned char **cached_data_ptr, |
323 unsigned char **cached_data_ptr, |
295 jint *cached_length_ptr); |
324 jint *cached_length_ptr) NOT_JVMTI_RETURN; |
296 static void post_native_method_bind(Method* method, address* function_ptr) KERNEL_RETURN; |
325 static void post_native_method_bind(Method* method, address* function_ptr) NOT_JVMTI_RETURN; |
297 static void post_compiled_method_load(nmethod *nm) KERNEL_RETURN; |
326 static void post_compiled_method_load(nmethod *nm) NOT_JVMTI_RETURN; |
298 static void post_dynamic_code_generated(const char *name, const void *code_begin, const void *code_end) KERNEL_RETURN; |
327 static void post_dynamic_code_generated(const char *name, const void *code_begin, const void *code_end) NOT_JVMTI_RETURN; |
299 |
328 |
300 // used to post a CompiledMethodUnload event |
329 // used to post a CompiledMethodUnload event |
301 static void post_compiled_method_unload(jmethodID mid, const void *code_begin) KERNEL_RETURN; |
330 static void post_compiled_method_unload(jmethodID mid, const void *code_begin) NOT_JVMTI_RETURN; |
302 |
331 |
303 // similiar to post_dynamic_code_generated except that it can be used to |
332 // similiar to post_dynamic_code_generated except that it can be used to |
304 // post a DynamicCodeGenerated event while holding locks in the VM. Any event |
333 // post a DynamicCodeGenerated event while holding locks in the VM. Any event |
305 // posted using this function is recorded by the enclosing event collector |
334 // posted using this function is recorded by the enclosing event collector |
306 // -- JvmtiDynamicCodeEventCollector. |
335 // -- JvmtiDynamicCodeEventCollector. |
307 static void post_dynamic_code_generated_while_holding_locks(const char* name, address code_begin, address code_end) KERNEL_RETURN; |
336 static void post_dynamic_code_generated_while_holding_locks(const char* name, address code_begin, address code_end) NOT_JVMTI_RETURN; |
308 |
337 |
309 static void post_garbage_collection_finish() KERNEL_RETURN; |
338 static void post_garbage_collection_finish() NOT_JVMTI_RETURN; |
310 static void post_garbage_collection_start() KERNEL_RETURN; |
339 static void post_garbage_collection_start() NOT_JVMTI_RETURN; |
311 static void post_data_dump() KERNEL_RETURN; |
340 static void post_data_dump() NOT_JVMTI_RETURN; |
312 static void post_monitor_contended_enter(JavaThread *thread, ObjectMonitor *obj_mntr) KERNEL_RETURN; |
341 static void post_monitor_contended_enter(JavaThread *thread, ObjectMonitor *obj_mntr) NOT_JVMTI_RETURN; |
313 static void post_monitor_contended_entered(JavaThread *thread, ObjectMonitor *obj_mntr) KERNEL_RETURN; |
342 static void post_monitor_contended_entered(JavaThread *thread, ObjectMonitor *obj_mntr) NOT_JVMTI_RETURN; |
314 static void post_monitor_wait(JavaThread *thread, oop obj, jlong timeout) KERNEL_RETURN; |
343 static void post_monitor_wait(JavaThread *thread, oop obj, jlong timeout) NOT_JVMTI_RETURN; |
315 static void post_monitor_waited(JavaThread *thread, ObjectMonitor *obj_mntr, jboolean timed_out) KERNEL_RETURN; |
344 static void post_monitor_waited(JavaThread *thread, ObjectMonitor *obj_mntr, jboolean timed_out) NOT_JVMTI_RETURN; |
316 static void post_object_free(JvmtiEnv* env, jlong tag) KERNEL_RETURN; |
345 static void post_object_free(JvmtiEnv* env, jlong tag) NOT_JVMTI_RETURN; |
317 static void post_resource_exhausted(jint resource_exhausted_flags, const char* detail) KERNEL_RETURN; |
346 static void post_resource_exhausted(jint resource_exhausted_flags, const char* detail) NOT_JVMTI_RETURN; |
318 static void record_vm_internal_object_allocation(oop object) KERNEL_RETURN; |
347 static void record_vm_internal_object_allocation(oop object) NOT_JVMTI_RETURN; |
319 // Post objects collected by vm_object_alloc_event_collector. |
348 // Post objects collected by vm_object_alloc_event_collector. |
320 static void post_vm_object_alloc(JavaThread *thread, oop object) KERNEL_RETURN; |
349 static void post_vm_object_alloc(JavaThread *thread, oop object) NOT_JVMTI_RETURN; |
321 // Collects vm internal objects for later event posting. |
350 // Collects vm internal objects for later event posting. |
322 inline static void vm_object_alloc_event_collector(oop object) { |
351 inline static void vm_object_alloc_event_collector(oop object) { |
323 if (should_post_vm_object_alloc()) { |
352 if (should_post_vm_object_alloc()) { |
324 record_vm_internal_object_allocation(object); |
353 record_vm_internal_object_allocation(object); |
325 } |
354 } |