Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc3710be authored by Yu-Han Yang's avatar Yu-Han Yang
Browse files

Call DeleteLocalRef on callObjectMethod's returned value

CallObjectMethod returns a local reference that's causing memory
leakage. We need to make sure all these local refs are deleted.

Bug: 214967397
Test: manual
Change-Id: I7462bd9293b214d75df5196ae42b4da1da904e1a
parent db5c3e91
Loading
Loading
Loading
Loading
+12 −11
Original line number Diff line number Diff line
@@ -226,15 +226,16 @@ jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo(
            env->NewObject(class_gnssAntennaInfoBuilder, method_gnssAntennaInfoBuilderCtor);

    // Set fields
    env->CallObjectMethod(gnssAntennaInfoBuilderObject,
    callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject,
                                   method_gnssAntennaInfoBuilderSetCarrierFrequencyMHz,
                                   gnssAntennaInfo.carrierFrequencyMHz);
    env->CallObjectMethod(gnssAntennaInfoBuilderObject,
                          method_gnssAntennaInfoBuilderSetPhaseCenterOffset, phaseCenterOffset);
    env->CallObjectMethod(gnssAntennaInfoBuilderObject,
    callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject,
                                   method_gnssAntennaInfoBuilderSetPhaseCenterOffset,
                                   phaseCenterOffset);
    callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject,
                                   method_gnssAntennaInfoBuilderSetPhaseCenterVariationCorrections,
                                   phaseCenterVariationCorrections);
    env->CallObjectMethod(gnssAntennaInfoBuilderObject,
    callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject,
                                   method_gnssAntennaInfoBuilderSetSignalGainCorrections,
                                   signalGainCorrections);

+41 −36
Original line number Diff line number Diff line
@@ -212,11 +212,12 @@ void setMeasurementData(JNIEnv* env, jobject& callbacksObj, jobject clock,
    jobject gnssMeasurementsEventBuilderObject =
            env->NewObject(class_gnssMeasurementsEventBuilder,
                           method_gnssMeasurementsEventBuilderCtor);
    env->CallObjectMethod(gnssMeasurementsEventBuilderObject,
    callObjectMethodIgnoringResult(env, gnssMeasurementsEventBuilderObject,
                                   method_gnssMeasurementsEventBuilderSetClock, clock);
    env->CallObjectMethod(gnssMeasurementsEventBuilderObject,
                          method_gnssMeasurementsEventBuilderSetMeasurements, measurementArray);
    env->CallObjectMethod(gnssMeasurementsEventBuilderObject,
    callObjectMethodIgnoringResult(env, gnssMeasurementsEventBuilderObject,
                                   method_gnssMeasurementsEventBuilderSetMeasurements,
                                   measurementArray);
    callObjectMethodIgnoringResult(env, gnssMeasurementsEventBuilderObject,
                                   method_gnssMeasurementsEventBuilderSetGnssAutomaticGainControls,
                                   gnssAgcArray);
    jobject gnssMeasurementsEventObject =
@@ -408,22 +409,22 @@ void GnssMeasurementCallbackAidl::translateSingleGnssMeasurement(JNIEnv* env,
                                       satellitePvt.satClockInfo.satHardwareCodeBiasMeters,
                                       satellitePvt.satClockInfo.satTimeCorrectionMeters,
                                       satellitePvt.satClockInfo.satClkDriftMps);
            env->CallObjectMethod(satellitePvtBuilderObject,
            callObjectMethodIgnoringResult(env, satellitePvtBuilderObject,
                                           method_satellitePvtBuilderSetPositionEcef, positionEcef);
            env->CallObjectMethod(satellitePvtBuilderObject,
            callObjectMethodIgnoringResult(env, satellitePvtBuilderObject,
                                           method_satellitePvtBuilderSetVelocityEcef, velocityEcef);
            env->CallObjectMethod(satellitePvtBuilderObject, method_satellitePvtBuilderSetClockInfo,
                                  clockInfo);
            callObjectMethodIgnoringResult(env, satellitePvtBuilderObject,
                                           method_satellitePvtBuilderSetClockInfo, clockInfo);
        }

        if (satFlags & SatellitePvt::HAS_IONO) {
            env->CallObjectMethod(satellitePvtBuilderObject,
            callObjectMethodIgnoringResult(env, satellitePvtBuilderObject,
                                           method_satellitePvtBuilderSetIonoDelayMeters,
                                           satellitePvt.ionoDelayMeters);
        }

        if (satFlags & SatellitePvt::HAS_TROPO) {
            env->CallObjectMethod(satellitePvtBuilderObject,
            callObjectMethodIgnoringResult(env, satellitePvtBuilderObject,
                                           method_satellitePvtBuilderSetTropoDelayMeters,
                                           satellitePvt.tropoDelayMeters);
        }
@@ -453,15 +454,17 @@ void GnssMeasurementCallbackAidl::translateSingleGnssMeasurement(JNIEnv* env,
            jobject correlationVectorBuilderObject =
                    env->NewObject(class_correlationVectorBuilder,
                                   method_correlationVectorBuilderCtor);
            env->CallObjectMethod(correlationVectorBuilderObject,
                                  method_correlationVectorBuilderSetMagnitude, magnitudeArray);
            env->CallObjectMethod(correlationVectorBuilderObject,
            callObjectMethodIgnoringResult(env, correlationVectorBuilderObject,
                                           method_correlationVectorBuilderSetMagnitude,
                                           magnitudeArray);
            callObjectMethodIgnoringResult(
                    env, correlationVectorBuilderObject,
                    method_correlationVectorBuilderSetFrequencyOffsetMetersPerSecond,
                    correlationVector.frequencyOffsetMps);
            env->CallObjectMethod(correlationVectorBuilderObject,
            callObjectMethodIgnoringResult(env, correlationVectorBuilderObject,
                                           method_correlationVectorBuilderSetSamplingStartMeters,
                                           correlationVector.samplingStartM);
            env->CallObjectMethod(correlationVectorBuilderObject,
            callObjectMethodIgnoringResult(env, correlationVectorBuilderObject,
                                           method_correlationVectorBuilderSetSamplingWidthMeters,
                                           correlationVector.samplingWidthM);
            jobject correlationVectorObject =
@@ -519,11 +522,13 @@ jobjectArray GnssMeasurementCallbackAidl::translateAllGnssAgcs(JNIEnv* env,
        const GnssAgc& gnssAgc = agcs[i];

        jobject agcBuilderObject = env->NewObject(class_gnssAgcBuilder, method_gnssAgcBuilderCtor);
        env->CallObjectMethod(agcBuilderObject, method_gnssAgcBuilderSetLevelDb,
        callObjectMethodIgnoringResult(env, agcBuilderObject, method_gnssAgcBuilderSetLevelDb,
                                       gnssAgc.agcLevelDb);
        env->CallObjectMethod(agcBuilderObject, method_gnssAgcBuilderSetConstellationType,
        callObjectMethodIgnoringResult(env, agcBuilderObject,
                                       method_gnssAgcBuilderSetConstellationType,
                                       (int)gnssAgc.constellation);
        env->CallObjectMethod(agcBuilderObject, method_gnssAgcBuilderSetCarrierFrequencyHz,
        callObjectMethodIgnoringResult(env, agcBuilderObject,
                                       method_gnssAgcBuilderSetCarrierFrequencyHz,
                                       gnssAgc.carrierFrequencyHz);
        jobject agcObject = env->CallObjectMethod(agcBuilderObject, method_gnssAgcBuilderBuild);

+7 −0
Original line number Diff line number Diff line
@@ -111,6 +111,13 @@ void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
    }
}

void callObjectMethodIgnoringResult(JNIEnv* env, jobject obj, jmethodID mid, ...) {
    va_list args;
    va_start(args, mid);
    env->DeleteLocalRef(env->CallObjectMethodV(obj, mid, args));
    va_end(args);
}

JavaObject::JavaObject(JNIEnv* env, jclass clazz, jmethodID defaultCtor)
      : env_(env), clazz_(clazz) {
    object_ = env_->NewObject(clazz_, defaultCtor);
+2 −0
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@ jboolean checkAidlStatus(const android::binder::Status& status, const char* erro

void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName);

void callObjectMethodIgnoringResult(JNIEnv* env, jobject obj, jmethodID mid, ...);

template <class T>
void logHidlError(hardware::Return<T>& result, const char* errorMessage) {
    ALOGE("%s HIDL transport error: %s", errorMessage, result.description().c_str());