< prev index next >
src/hotspot/share/prims/jvmtiEnvBase.cpp
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 645,661 ****
}
jvmtiError
! JvmtiEnvBase::get_current_contended_monitor(JavaThread *calling_thread, JavaThread *java_thread, jobject *monitor_ptr) {
! #ifdef ASSERT
! uint32_t debug_bits = 0;
! #endif
! assert((SafepointSynchronize::is_at_safepoint() ||
! java_thread->is_thread_fully_suspended(false, &debug_bits)),
! "at safepoint or target thread is suspended");
oop obj = NULL;
ObjectMonitor *mon = java_thread->current_waiting_monitor();
if (mon == NULL) {
// thread is not doing an Object.wait() call
mon = java_thread->current_pending_monitor();
--- 645,659 ----
}
jvmtiError
! JvmtiEnvBase::get_current_contended_monitor(JavaThread *java_thread, jobject *monitor_ptr) {
! assert(!Thread::current()->is_VM_thread() &&
! (Thread::current() == java_thread ||
! Thread::current() == java_thread->active_handshaker()),
! "call by myself or at direct handshake");
oop obj = NULL;
ObjectMonitor *mon = java_thread->current_waiting_monitor();
if (mon == NULL) {
// thread is not doing an Object.wait() call
mon = java_thread->current_pending_monitor();
*** 673,699 ****
if (obj == NULL) {
*monitor_ptr = NULL;
} else {
HandleMark hm;
! Handle hobj(Thread::current(), obj);
! *monitor_ptr = jni_reference(calling_thread, hobj);
}
return JVMTI_ERROR_NONE;
}
jvmtiError
! JvmtiEnvBase::get_owned_monitors(JavaThread *calling_thread, JavaThread* java_thread,
GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list) {
jvmtiError err = JVMTI_ERROR_NONE;
! #ifdef ASSERT
! uint32_t debug_bits = 0;
! #endif
! assert((SafepointSynchronize::is_at_safepoint() ||
! java_thread->is_thread_fully_suspended(false, &debug_bits)),
! "at safepoint or target thread is suspended");
if (java_thread->has_last_Java_frame()) {
ResourceMark rm;
HandleMark hm;
RegisterMap reg_map(java_thread);
--- 671,696 ----
if (obj == NULL) {
*monitor_ptr = NULL;
} else {
HandleMark hm;
! JavaThread *current_jt = reinterpret_cast<JavaThread *>(JavaThread::current());
! Handle hobj(current_jt, obj);
! *monitor_ptr = jni_reference(current_jt, hobj);
}
return JVMTI_ERROR_NONE;
}
jvmtiError
! JvmtiEnvBase::get_owned_monitors(JavaThread* java_thread,
GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list) {
jvmtiError err = JVMTI_ERROR_NONE;
! assert(!Thread::current()->is_VM_thread() &&
! (Thread::current() == java_thread ||
! Thread::current() == java_thread->active_handshaker()),
! "call by myself or at direct handshake");
if (java_thread->has_last_Java_frame()) {
ResourceMark rm;
HandleMark hm;
RegisterMap reg_map(java_thread);
*** 701,720 ****
int depth = 0;
for (javaVFrame *jvf = java_thread->last_java_vframe(®_map); jvf != NULL;
jvf = jvf->java_sender()) {
if (MaxJavaStackTraceDepth == 0 || depth++ < MaxJavaStackTraceDepth) { // check for stack too deep
// add locked objects for this frame into list
! err = get_locked_objects_in_frame(calling_thread, java_thread, jvf, owned_monitors_list, depth-1);
if (err != JVMTI_ERROR_NONE) {
return err;
}
}
}
}
// Get off stack monitors. (e.g. acquired via jni MonitorEnter).
! JvmtiMonitorClosure jmc(java_thread, calling_thread, owned_monitors_list, this);
ObjectSynchronizer::monitors_iterate(&jmc);
err = jmc.error();
return err;
}
--- 698,717 ----
int depth = 0;
for (javaVFrame *jvf = java_thread->last_java_vframe(®_map); jvf != NULL;
jvf = jvf->java_sender()) {
if (MaxJavaStackTraceDepth == 0 || depth++ < MaxJavaStackTraceDepth) { // check for stack too deep
// add locked objects for this frame into list
! err = get_locked_objects_in_frame(JavaThread::current(), java_thread, jvf, owned_monitors_list, depth-1);
if (err != JVMTI_ERROR_NONE) {
return err;
}
}
}
}
// Get off stack monitors. (e.g. acquired via jni MonitorEnter).
! JvmtiMonitorClosure jmc(java_thread, JavaThread::current(), owned_monitors_list, this);
ObjectSynchronizer::monitors_iterate(&jmc);
err = jmc.error();
return err;
}
*** 1540,1567 ****
_result = JVMTI_ERROR_THREAD_NOT_ALIVE;
}
}
void
! VM_GetOwnedMonitorInfo::doit() {
! _result = JVMTI_ERROR_THREAD_NOT_ALIVE;
! ThreadsListHandle tlh;
! if (_java_thread != NULL && tlh.includes(_java_thread)
! && !_java_thread->is_exiting() && _java_thread->threadObj() != NULL) {
! _result = ((JvmtiEnvBase *)_env)->get_owned_monitors(_calling_thread, _java_thread,
! _owned_monitors_list);
! }
}
void
! VM_GetCurrentContendedMonitor::doit() {
! _result = JVMTI_ERROR_THREAD_NOT_ALIVE;
! ThreadsListHandle tlh;
! if (_java_thread != NULL && tlh.includes(_java_thread)
! && !_java_thread->is_exiting() && _java_thread->threadObj() != NULL) {
! _result = ((JvmtiEnvBase *)_env)->get_current_contended_monitor(_calling_thread,_java_thread,_owned_monitor_ptr);
! }
}
void
VM_GetStackTrace::doit() {
_result = JVMTI_ERROR_THREAD_NOT_ALIVE;
--- 1537,1553 ----
_result = JVMTI_ERROR_THREAD_NOT_ALIVE;
}
}
void
! GetOwnedMonitorInfoClosure::do_thread(Thread *target) {
! _result = ((JvmtiEnvBase *)_env)->get_owned_monitors((JavaThread *)target, _owned_monitors_list);
}
void
! GetCurrentContendedMonitorClosure::do_thread(Thread *target) {
! _result = ((JvmtiEnvBase *)_env)->get_current_contended_monitor((JavaThread *)target, _owned_monitor_ptr);
}
void
VM_GetStackTrace::doit() {
_result = JVMTI_ERROR_THREAD_NOT_ALIVE;
< prev index next >