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());
|