jvmtiError walkHeapFromObjects()

in src/sizes/retained_size_action.cpp [127:157]


jvmtiError walkHeapFromObjects(jvmtiEnv *jvmti,
                               const std::vector<jobject> &objects,
                               const CancellationChecker &cancellationChecker) {
    jvmtiError err = JVMTI_ERROR_NONE;
    if (!objects.empty()) {
        jvmtiHeapCallbacks cb;
        std::memset(&cb, 0, sizeof(jvmtiHeapCallbacks));
        cb.heap_reference_callback = reinterpret_cast<jvmtiHeapReferenceCallback>(&spreadInfo);
        int heapWalksCnt = 0;
        for (auto &object : objects) {
            if (cancellationChecker.shouldStopExecution()) {
                return MEMORY_AGENT_INTERRUPTED_ERROR;
            }

            jlong tag;
            err = jvmti->GetTag(object, &tag);
            if (err != JVMTI_ERROR_NONE) return err;

            if (tagsWithNewInfo.find(tag) != tagsWithNewInfo.end()) {
                tagsWithNewInfo.erase(tag);
                err = jvmti->FollowReferences(0, nullptr, object, &cb, nullptr);
                if (err != JVMTI_ERROR_NONE) return err;
                logger::debug(std::to_string(tagsWithNewInfo.size()).c_str());
                heapWalksCnt++;
            }
        }
        logger::debug(std::string("Total heap walks: " + std::to_string(heapWalksCnt)).c_str());
    }

    return err;
}