< prev index next >
src/hotspot/share/prims/jvmtiExport.cpp
Print this page
rev 47862 : imported patch 10.07.open.rebase_20171110.dcubed
*** 51,60 ****
--- 51,61 ----
#include "runtime/javaCalls.hpp"
#include "runtime/objectMonitor.hpp"
#include "runtime/objectMonitor.inline.hpp"
#include "runtime/os.inline.hpp"
#include "runtime/thread.inline.hpp"
+ #include "runtime/threadSMR.hpp"
#include "runtime/vframe.hpp"
#include "services/serviceUtil.hpp"
#include "utilities/macros.hpp"
#if INCLUDE_ALL_GCS
#include "gc/parallel/psMarkSweep.hpp"
*** 719,728 ****
--- 720,831 ----
MutexLocker mu(JvmtiThreadState_lock);
return JvmtiEnvBase::get_all_native_method_prefixes(count_ptr);
}
}
+ // Convert an external thread reference to a JavaThread found on the
+ // specified ThreadsList. The ThreadsListHandle in the caller "protects"
+ // the returned JavaThread *.
+ //
+ // If thread_oop_p is not NULL, then the caller wants to use the oop
+ // after this call so the oop is returned. On success, *jt_pp is set
+ // to the converted JavaThread * and JVMTI_ERROR_NONE is returned.
+ // On error, returns various JVMTI_ERROR_* values.
+ //
+ jvmtiError
+ JvmtiExport::cv_external_thread_to_JavaThread(ThreadsList * t_list,
+ jthread thread,
+ JavaThread ** jt_pp,
+ oop * thread_oop_p) {
+ assert(t_list != NULL, "must have a ThreadsList");
+ assert(jt_pp != NULL, "must have a return JavaThread pointer");
+ // thread_oop_p is optional so no assert()
+
+ oop thread_oop = JNIHandles::resolve_external_guard(thread);
+ if (thread_oop == NULL) {
+ // NULL jthread, GC'ed jthread or a bad JNI handle.
+ return JVMTI_ERROR_INVALID_THREAD;
+ }
+ // Looks like an oop at this point.
+
+ if (!thread_oop->is_a(SystemDictionary::Thread_klass())) {
+ // The oop is not a java.lang.Thread.
+ return JVMTI_ERROR_INVALID_THREAD;
+ }
+ // Looks like a java.lang.Thread oop at this point.
+
+ if (thread_oop_p != NULL) {
+ // Return the oop to the caller; the caller may still want
+ // the oop even if this function returns an error.
+ *thread_oop_p = thread_oop;
+ }
+
+ JavaThread * java_thread = java_lang_Thread::thread(thread_oop);
+ if (java_thread == NULL) {
+ // The java.lang.Thread does not contain a JavaThread * so it has
+ // not yet run or it has died.
+ return JVMTI_ERROR_THREAD_NOT_ALIVE;
+ }
+ // Looks like a live JavaThread at this point.
+
+ // We do not check the EnableThreadSMRExtraValidityChecks option
+ // for this includes() call because JVM/TI's spec is tighter.
+ if (!t_list->includes(java_thread)) {
+ // Not on the JavaThreads list so it is not alive.
+ return JVMTI_ERROR_THREAD_NOT_ALIVE;
+ }
+
+ // Return a live JavaThread that is "protected" by the
+ // ThreadsListHandle in the caller.
+ *jt_pp = java_thread;
+
+ return JVMTI_ERROR_NONE;
+ }
+
+ // Convert an oop to a JavaThread found on the specified ThreadsList.
+ // The ThreadsListHandle in the caller "protects" the returned
+ // JavaThread *.
+ //
+ // On success, *jt_pp is set to the converted JavaThread * and
+ // JVMTI_ERROR_NONE is returned. On error, returns various
+ // JVMTI_ERROR_* values.
+ //
+ jvmtiError
+ JvmtiExport::cv_oop_to_JavaThread(ThreadsList * t_list, oop thread_oop,
+ JavaThread ** jt_pp) {
+ assert(t_list != NULL, "must have a ThreadsList");
+ assert(thread_oop != NULL, "must have an oop");
+ assert(jt_pp != NULL, "must have a return JavaThread pointer");
+
+ if (!thread_oop->is_a(SystemDictionary::Thread_klass())) {
+ // The oop is not a java.lang.Thread.
+ return JVMTI_ERROR_INVALID_THREAD;
+ }
+ // Looks like a java.lang.Thread oop at this point.
+
+ JavaThread * java_thread = java_lang_Thread::thread(thread_oop);
+ if (java_thread == NULL) {
+ // The java.lang.Thread does not contain a JavaThread * so it has
+ // not yet run or it has died.
+ return JVMTI_ERROR_THREAD_NOT_ALIVE;
+ }
+ // Looks like a live JavaThread at this point.
+
+ // We do not check the EnableThreadSMRExtraValidityChecks option
+ // for this includes() call because JVM/TI's spec is tighter.
+ if (!t_list->includes(java_thread)) {
+ // Not on the JavaThreads list so it is not alive.
+ return JVMTI_ERROR_THREAD_NOT_ALIVE;
+ }
+
+ // Return a live JavaThread that is "protected" by the
+ // ThreadsListHandle in the caller.
+ *jt_pp = java_thread;
+
+ return JVMTI_ERROR_NONE;
+ }
+
class JvmtiClassFileLoadHookPoster : public StackObj {
private:
Symbol* _h_name;
Handle _class_loader;
Handle _h_protection_domain;
*** 2683,2694 ****
// no-op if jvmti not enabled
if (!JvmtiEnv::environments_might_exist()) {
return;
}
! // Runs at safepoint. So no need to acquire Threads_lock.
! for (JavaThread *jthr = Threads::first(); jthr != NULL; jthr = jthr->next()) {
JvmtiThreadState *state = jthr->jvmti_thread_state();
if (state != NULL) {
JvmtiVMObjectAllocEventCollector *collector;
collector = state->get_vm_object_alloc_event_collector();
while (collector != NULL) {
--- 2786,2796 ----
// no-op if jvmti not enabled
if (!JvmtiEnv::environments_might_exist()) {
return;
}
! for (JavaThreadIteratorWithHandle jtiwh; JavaThread *jthr = jtiwh.next(); ) {
JvmtiThreadState *state = jthr->jvmti_thread_state();
if (state != NULL) {
JvmtiVMObjectAllocEventCollector *collector;
collector = state->get_vm_object_alloc_event_collector();
while (collector != NULL) {
< prev index next >