< prev index next >

src/hotspot/share/services/threadService.cpp

Print this page

1468 
1469   // Handshake with target
1470   Handle thread_h(THREAD, thread_oop);
1471   GetThreadSnapshotHandshakeClosure cl(thread_h);
1472   if (java_lang_VirtualThread::is_instance(thread_oop)) {
1473     Handshake::execute(&cl, thread_oop);
1474   } else {
1475     Handshake::execute(&cl, &tlh, java_thread);
1476   }
1477 
1478   assert(cl._processed || (!is_virtual && java_thread->is_terminated()), "should have executed handshake closure");
1479   if (!cl._processed || cl._thread_status == JavaThreadStatus::TERMINATED) {
1480     return nullptr; // thread terminated
1481   }
1482   assert(cl._thread_status != JavaThreadStatus::NEW, "unstarted Thread");
1483 
1484   // StackTrace
1485   InstanceKlass* ste_klass = vmClasses::StackTraceElement_klass();
1486   assert(ste_klass != nullptr, "must be loaded");
1487 
1488   objArrayHandle trace = oopFactory::new_objArray_handle(ste_klass, cl._frame_count, CHECK_NULL);
1489 
1490   for (int i = 0; i < cl._frame_count; i++) {
1491     methodHandle method(THREAD, cl._methods->at(i));
1492     oop element = java_lang_StackTraceElement::create(method, cl._bcis->at(i), CHECK_NULL);
1493     trace->obj_at_put(i, element);
1494   }
1495 
1496   // Locks
1497   Symbol* lock_sym = vmSymbols::jdk_internal_vm_ThreadLock();
1498   Klass* lock_k = SystemDictionary::resolve_or_fail(lock_sym, true, CHECK_NULL);
1499   InstanceKlass* lock_klass = InstanceKlass::cast(lock_k);
1500 
1501   objArrayHandle locks;
1502   if (cl._locks != nullptr && cl._locks->length() > 0) {
1503     locks = oopFactory::new_objArray_handle(lock_klass, cl._locks->length(), CHECK_NULL);
1504     for (int n = 0; n < cl._locks->length(); n++) {
1505       GetThreadSnapshotHandshakeClosure::OwnedLock* lock_info = cl._locks->adr_at(n);
1506 
1507       Handle lock = jdk_internal_vm_ThreadLock::create(lock_klass,
1508         lock_info->_frame_depth, lock_info->_type, lock_info->_obj, CHECK_NULL);
1509       locks->obj_at_put(n, lock());
1510     }
1511   }
1512 
1513   Symbol* snapshot_klass_name = vmSymbols::jdk_internal_vm_ThreadSnapshot();
1514   Klass* snapshot_klass = SystemDictionary::resolve_or_fail(snapshot_klass_name, true, CHECK_NULL);
1515   if (snapshot_klass->should_be_initialized()) {
1516     snapshot_klass->initialize(CHECK_NULL);
1517   }
1518 
1519   Handle snapshot = jdk_internal_vm_ThreadSnapshot::allocate(InstanceKlass::cast(snapshot_klass), CHECK_NULL);
1520   jdk_internal_vm_ThreadSnapshot::set_name(snapshot(), cl._thread_name.resolve());
1521   jdk_internal_vm_ThreadSnapshot::set_thread_status(snapshot(), (int)cl._thread_status);
1522   jdk_internal_vm_ThreadSnapshot::set_carrier_thread(snapshot(), cl._carrier_thread.resolve());
1523   jdk_internal_vm_ThreadSnapshot::set_stack_trace(snapshot(), trace());

1468 
1469   // Handshake with target
1470   Handle thread_h(THREAD, thread_oop);
1471   GetThreadSnapshotHandshakeClosure cl(thread_h);
1472   if (java_lang_VirtualThread::is_instance(thread_oop)) {
1473     Handshake::execute(&cl, thread_oop);
1474   } else {
1475     Handshake::execute(&cl, &tlh, java_thread);
1476   }
1477 
1478   assert(cl._processed || (!is_virtual && java_thread->is_terminated()), "should have executed handshake closure");
1479   if (!cl._processed || cl._thread_status == JavaThreadStatus::TERMINATED) {
1480     return nullptr; // thread terminated
1481   }
1482   assert(cl._thread_status != JavaThreadStatus::NEW, "unstarted Thread");
1483 
1484   // StackTrace
1485   InstanceKlass* ste_klass = vmClasses::StackTraceElement_klass();
1486   assert(ste_klass != nullptr, "must be loaded");
1487 
1488   refArrayHandle trace = oopFactory::new_refArray_handle(ste_klass, cl._frame_count, CHECK_NULL);
1489 
1490   for (int i = 0; i < cl._frame_count; i++) {
1491     methodHandle method(THREAD, cl._methods->at(i));
1492     oop element = java_lang_StackTraceElement::create(method, cl._bcis->at(i), CHECK_NULL);
1493     trace->obj_at_put(i, element);
1494   }
1495 
1496   // Locks
1497   Symbol* lock_sym = vmSymbols::jdk_internal_vm_ThreadLock();
1498   Klass* lock_k = SystemDictionary::resolve_or_fail(lock_sym, true, CHECK_NULL);
1499   InstanceKlass* lock_klass = InstanceKlass::cast(lock_k);
1500 
1501   refArrayHandle locks;
1502   if (cl._locks != nullptr && cl._locks->length() > 0) {
1503     locks = oopFactory::new_refArray_handle(lock_klass, cl._locks->length(), CHECK_NULL);
1504     for (int n = 0; n < cl._locks->length(); n++) {
1505       GetThreadSnapshotHandshakeClosure::OwnedLock* lock_info = cl._locks->adr_at(n);
1506 
1507       Handle lock = jdk_internal_vm_ThreadLock::create(lock_klass,
1508         lock_info->_frame_depth, lock_info->_type, lock_info->_obj, CHECK_NULL);
1509       locks->obj_at_put(n, lock());
1510     }
1511   }
1512 
1513   Symbol* snapshot_klass_name = vmSymbols::jdk_internal_vm_ThreadSnapshot();
1514   Klass* snapshot_klass = SystemDictionary::resolve_or_fail(snapshot_klass_name, true, CHECK_NULL);
1515   if (snapshot_klass->should_be_initialized()) {
1516     snapshot_klass->initialize(CHECK_NULL);
1517   }
1518 
1519   Handle snapshot = jdk_internal_vm_ThreadSnapshot::allocate(InstanceKlass::cast(snapshot_klass), CHECK_NULL);
1520   jdk_internal_vm_ThreadSnapshot::set_name(snapshot(), cl._thread_name.resolve());
1521   jdk_internal_vm_ThreadSnapshot::set_thread_status(snapshot(), (int)cl._thread_status);
1522   jdk_internal_vm_ThreadSnapshot::set_carrier_thread(snapshot(), cl._carrier_thread.resolve());
1523   jdk_internal_vm_ThreadSnapshot::set_stack_trace(snapshot(), trace());
< prev index next >