in src/reachability/objects_of_class_in_heap.cpp [12:38]
jint JNICALL findReachableObjectsOfClass(jvmtiHeapReferenceKind refKind, const jvmtiHeapReferenceInfo *refInfo, jlong classTag,
jlong referrerClassTag, jlong size, jlong *tagPtr,
jlong *referrerTagPtr, jint length, void *userData) {
if (*tagPtr == REFERENCE_CLASS_TAG || *tagPtr == CLASS_TAG) {
return JVMTI_VISIT_OBJECTS;
} else if (classTag == REFERENCE_CLASS_TAG) {
*tagPtr = WEAK_SOFT_REACHABLE_TAG; // tag soft/weak/phantom reference
} else if (*tagPtr == 0) {
if (referrerTagPtr != nullptr && *referrerTagPtr == WEAK_SOFT_REACHABLE_TAG) {
*tagPtr = WEAK_SOFT_REACHABLE_TAG;
} else {
*tagPtr = STRONG_REACHABLE_TAG;
}
} else if (*tagPtr == WEAK_SOFT_REACHABLE_TAG) {
if (referrerTagPtr == nullptr || *referrerTagPtr != WEAK_SOFT_REACHABLE_TAG) {
*tagPtr = STRONG_REACHABLE_TAG;
}
}
if (classTag == CLASS_TAG && *tagPtr == STRONG_REACHABLE_TAG) {
*tagPtr = OBJECT_OF_CLASS_TAG;
if (*reinterpret_cast<bool *>(userData)) {
return JVMTI_VISIT_ABORT;
}
}
return JVMTI_VISIT_OBJECTS;
}