in src/roots/paths_to_closest_gc_roots.cpp [11:35]
jint JNICALL collectPaths(jvmtiHeapReferenceKind referenceKind,
const jvmtiHeapReferenceInfo *referenceInfo, jlong classTag,
jlong referrerClassTag, jlong size, jlong *tagPtr,
jlong *referrerTagPtr, jint length, void *userData) {
if (*tagPtr == 0) {
*tagPtr = pointerToTag(GcTag::create(referrerClassTag));
}
GcTag *tag = GcTag::pointerToGcTag(*tagPtr);
if (referrerTagPtr != nullptr) {
if (referrerClassTag != 0 && GcTag::pointerToGcTag(referrerClassTag)->isWeakSoftReachable()) {
tag->updateState(GcTag::pointerToGcTag(referrerClassTag));
} else {
tag->updateState(GcTag::pointerToGcTag(*referrerTagPtr));
}
tag->backRefs.push_back(createReferenceInfo(*referrerTagPtr, referenceKind, referenceInfo));
} else {
// gc root found
tag->backRefs.push_back(createReferenceInfo(-1, referenceKind, referenceInfo));
}
tag->setVisited();
return JVMTI_VISIT_OBJECTS;
}