jint JNICALL findReachableObjectsOfClass()

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;
}