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