void setTagsForReferences()

in src/roots/paths_to_closest_gc_roots.cpp [291:317]


void setTagsForReferences(JNIEnv *env, jvmtiEnv *jvmti, jlong tag) {
    const char *refClassesNames[3] = {
            "java/lang/ref/SoftReference",
            "java/lang/ref/WeakReference",
            "java/lang/ref/PhantomReference"
    };
    jclass refClasses[3];
    for (int i = 0; i < 3; i++) {
        refClasses[i] = env->FindClass(refClassesNames[i]);
    }

    jclass *classes;
    jint cnt;
    jvmtiError err = jvmti->GetLoadedClasses(&cnt, &classes);
    handleError(jvmti, err, "Couldn't get loaded classes");
    jmethodID isAssignableFrom = getIsAssignableFromMethod(env);

    for (int i = 0; i < cnt; i++) {
        for (auto & refClass : refClasses) {
            if (env->CallBooleanMethod(refClass, isAssignableFrom, classes[i])) {
                err = jvmti->SetTag(classes[i], tag);
                handleError(jvmti, err, "Couldn't set tag for reference class");
                break;
            }
        }
    }
}