< prev index next >

src/hotspot/share/services/threadService.cpp

Print this page

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

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