341 bool is_enabled(jvmtiEvent event_type) {
342 return _env_event_enable.is_enabled(event_type);
343 }
344
345 // Random Utilities
346
347 protected:
348 // helper methods for creating arrays of global JNI Handles from local Handles
349 // allocated into environment specific storage
350 jthread * new_jthreadArray(int length, Handle *handles);
351 jthreadGroup * new_jthreadGroupArray(int length, objArrayHandle groups);
352
353 // convert to a jni jclass from a non-null Klass*
354 jclass get_jni_class_non_null(Klass* k);
355
356 jint count_locked_objects(JavaThread *java_thread, Handle hobj);
357 jvmtiError get_locked_objects_in_frame(JavaThread *calling_thread,
358 JavaThread* java_thread,
359 javaVFrame *jvf,
360 GrowableArray<jvmtiMonitorStackDepthInfo*>* owned_monitors_list,
361 jint depth);
362 public:
363 static javaVFrame* jvf_for_thread_and_depth(JavaThread* java_thread, jint depth);
364
365 // get a field descriptor for the specified class and field
366 static bool get_field_descriptor(Klass* k, jfieldID field, fieldDescriptor* fd);
367
368 // check and skip frames hidden in mount/unmount transitions
369 static javaVFrame* check_and_skip_hidden_frames(bool is_in_VTMS_transition, javaVFrame* jvf);
370 static javaVFrame* check_and_skip_hidden_frames(JavaThread* jt, javaVFrame* jvf);
371 static javaVFrame* check_and_skip_hidden_frames(oop vthread, javaVFrame* jvf);
372
373 // check if virtual thread is not terminated (alive)
374 static bool is_vthread_alive(oop vt);
375
376 // return JavaThread if virtual thread is mounted, null otherwise
377 static JavaThread* get_JavaThread_or_null(oop vthread);
378
379 // get virtual thread last java vframe
380 static javaVFrame* get_vthread_jvf(oop vthread);
381
405 jvmtiError get_frame_count(oop frame_oop, jint *count_ptr);
406 jvmtiError get_frame_location(javaVFrame* jvf, jint depth,
407 jmethodID* method_ptr, jlocation* location_ptr);
408 jvmtiError get_frame_location(JavaThread* java_thread, jint depth,
409 jmethodID* method_ptr, jlocation* location_ptr);
410 jvmtiError get_frame_location(oop vthread_oop, jint depth,
411 jmethodID* method_ptr, jlocation* location_ptr);
412 jvmtiError set_frame_pop(JvmtiThreadState* state, javaVFrame* jvf, jint depth);
413 jvmtiError get_object_monitor_usage(JavaThread* calling_thread,
414 jobject object, jvmtiMonitorUsage* info_ptr);
415 jvmtiError get_stack_trace(javaVFrame* jvf,
416 jint stack_depth, jint max_count,
417 jvmtiFrameInfo* frame_buffer, jint* count_ptr);
418 jvmtiError get_stack_trace(JavaThread* java_thread,
419 jint stack_depth, jint max_count,
420 jvmtiFrameInfo* frame_buffer, jint* count_ptr);
421 jvmtiError get_current_contended_monitor(JavaThread* calling_thread, JavaThread* java_thread,
422 jobject* monitor_ptr, bool is_virtual);
423 jvmtiError get_owned_monitors(JavaThread* calling_thread, JavaThread* java_thread,
424 GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list);
425 jvmtiError get_owned_monitors(JavaThread* calling_thread, JavaThread* java_thread, javaVFrame* jvf,
426 GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list);
427 static jvmtiError check_top_frame(Thread* current_thread, JavaThread* java_thread,
428 jvalue value, TosState tos, Handle* ret_ob_h);
429 jvmtiError force_early_return(jthread thread, jvalue value, TosState tos);
430 };
431
432 // This class is the only safe means of iterating through environments.
433 // Note that this iteratation includes invalid environments pending
434 // deallocation -- in fact, some uses depend on this behavior.
435
436 class JvmtiEnvIterator : public StackObj {
437 private:
438 bool _entry_was_marked;
439 public:
440 JvmtiEnvIterator() {
441 if (Threads::number_of_threads() == 0) {
442 _entry_was_marked = false; // we are single-threaded, no need
443 } else {
444 Thread::current()->entering_jvmti_env_iteration();
445 _entry_was_marked = true;
446 }
|
341 bool is_enabled(jvmtiEvent event_type) {
342 return _env_event_enable.is_enabled(event_type);
343 }
344
345 // Random Utilities
346
347 protected:
348 // helper methods for creating arrays of global JNI Handles from local Handles
349 // allocated into environment specific storage
350 jthread * new_jthreadArray(int length, Handle *handles);
351 jthreadGroup * new_jthreadGroupArray(int length, objArrayHandle groups);
352
353 // convert to a jni jclass from a non-null Klass*
354 jclass get_jni_class_non_null(Klass* k);
355
356 jint count_locked_objects(JavaThread *java_thread, Handle hobj);
357 jvmtiError get_locked_objects_in_frame(JavaThread *calling_thread,
358 JavaThread* java_thread,
359 javaVFrame *jvf,
360 GrowableArray<jvmtiMonitorStackDepthInfo*>* owned_monitors_list,
361 jint depth, oop vthread = nullptr);
362 public:
363 static javaVFrame* jvf_for_thread_and_depth(JavaThread* java_thread, jint depth);
364
365 // get a field descriptor for the specified class and field
366 static bool get_field_descriptor(Klass* k, jfieldID field, fieldDescriptor* fd);
367
368 // check and skip frames hidden in mount/unmount transitions
369 static javaVFrame* check_and_skip_hidden_frames(bool is_in_VTMS_transition, javaVFrame* jvf);
370 static javaVFrame* check_and_skip_hidden_frames(JavaThread* jt, javaVFrame* jvf);
371 static javaVFrame* check_and_skip_hidden_frames(oop vthread, javaVFrame* jvf);
372
373 // check if virtual thread is not terminated (alive)
374 static bool is_vthread_alive(oop vt);
375
376 // return JavaThread if virtual thread is mounted, null otherwise
377 static JavaThread* get_JavaThread_or_null(oop vthread);
378
379 // get virtual thread last java vframe
380 static javaVFrame* get_vthread_jvf(oop vthread);
381
405 jvmtiError get_frame_count(oop frame_oop, jint *count_ptr);
406 jvmtiError get_frame_location(javaVFrame* jvf, jint depth,
407 jmethodID* method_ptr, jlocation* location_ptr);
408 jvmtiError get_frame_location(JavaThread* java_thread, jint depth,
409 jmethodID* method_ptr, jlocation* location_ptr);
410 jvmtiError get_frame_location(oop vthread_oop, jint depth,
411 jmethodID* method_ptr, jlocation* location_ptr);
412 jvmtiError set_frame_pop(JvmtiThreadState* state, javaVFrame* jvf, jint depth);
413 jvmtiError get_object_monitor_usage(JavaThread* calling_thread,
414 jobject object, jvmtiMonitorUsage* info_ptr);
415 jvmtiError get_stack_trace(javaVFrame* jvf,
416 jint stack_depth, jint max_count,
417 jvmtiFrameInfo* frame_buffer, jint* count_ptr);
418 jvmtiError get_stack_trace(JavaThread* java_thread,
419 jint stack_depth, jint max_count,
420 jvmtiFrameInfo* frame_buffer, jint* count_ptr);
421 jvmtiError get_current_contended_monitor(JavaThread* calling_thread, JavaThread* java_thread,
422 jobject* monitor_ptr, bool is_virtual);
423 jvmtiError get_owned_monitors(JavaThread* calling_thread, JavaThread* java_thread,
424 GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list);
425 jvmtiError get_owned_monitors(JavaThread* calling_thread, JavaThread* carrier, javaVFrame* jvf,
426 GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list, oop vthread);
427 static jvmtiError check_top_frame(Thread* current_thread, JavaThread* java_thread,
428 jvalue value, TosState tos, Handle* ret_ob_h);
429 jvmtiError force_early_return(jthread thread, jvalue value, TosState tos);
430 };
431
432 // This class is the only safe means of iterating through environments.
433 // Note that this iteratation includes invalid environments pending
434 // deallocation -- in fact, some uses depend on this behavior.
435
436 class JvmtiEnvIterator : public StackObj {
437 private:
438 bool _entry_was_marked;
439 public:
440 JvmtiEnvIterator() {
441 if (Threads::number_of_threads() == 0) {
442 _entry_was_marked = false; // we are single-threaded, no need
443 } else {
444 Thread::current()->entering_jvmti_env_iteration();
445 _entry_was_marked = true;
446 }
|