jint JNICALL getTagsWithNewInfo()

in src/sizes/retained_size_action.cpp [34:57]


jint JNICALL getTagsWithNewInfo(jvmtiHeapReferenceKind refKind, const jvmtiHeapReferenceInfo *refInfo, jlong classTag,
                                jlong referrerClassTag, jlong size, jlong *tagPtr,
                                jlong *referrerTagPtr, jint length, void *userData) {
    if (refKind == JVMTI_HEAP_REFERENCE_JNI_LOCAL || refKind == JVMTI_HEAP_REFERENCE_JNI_GLOBAL ||
        isTagWithNewInfo(*tagPtr) || handleReferrersWithNoInfo(referrerTagPtr, tagPtr, true)) {
        return JVMTI_VISIT_OBJECTS;
    }

    Tag *referrer = tagToPointer(*referrerTagPtr);
    Tag *referree = tagToPointer(*tagPtr);
    if (*tagPtr == 0) {
        *tagPtr = pointerToTag(referrer->share());
    } else if (tagsAreValidForMerge(*tagPtr, *referrerTagPtr)) {
        if (referree->alreadyReferred) {
            referree->unref();
            *tagPtr = pointerToTag(&Tag::TagWithNewInfo);
        } else {
            *tagPtr = pointerToTag(merge(*tagPtr, *referrerTagPtr));
        }
    }

    referrer->alreadyReferred = true;
    return JVMTI_VISIT_OBJECTS;
}