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

Commit e020ce28 authored by Hridya Valsaraju's avatar Hridya Valsaraju
Browse files

Return existing interfaces for repeated getExtension calls

Also, reset static state in destructors of interfaces.

Until now, new interfaces were being created for each repeated
getExtension() call to the Gnss interface. This was causing
asserts to fail which were checking for multiple
simultaneous instances of these interfaces.

Death notifications should still required to be created for all
interfaces including callback interfaces.

Bug: 35391416
Test: Verified that Maps still work after forcing a system_server
crash.

Change-Id: I8ce0888016637a3d9b62db5619a3c8c569262c0d
parent b0729731
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ AGnss::AGnss(const AGpsInterface* aGpsIface) : mAGnssIface(aGpsIface) {

AGnss::~AGnss() {
    sThreadFuncArgsList.clear();
    sInterfaceExists = false;
}

void AGnss::statusCb(AGpsStatus* status) {
@@ -78,7 +79,10 @@ void AGnss::statusCb(AGpsStatus* status) {
                    /*
                     * Callback to client with agnssStatusIpV4Cb.
                     */
                    sAGnssCbIface->agnssStatusIpV4Cb(aGnssStatusIpV4);
                    auto ret = sAGnssCbIface->agnssStatusIpV4Cb(aGnssStatusIpV4);
                    if (!ret.isOk()) {
                        ALOGE("%s: Unable to invoke callback", __func__);
                    }
                    break;
                }
            case AF_INET6:
@@ -96,7 +100,10 @@ void AGnss::statusCb(AGpsStatus* status) {
                            &(status->addr));
                    memcpy(&(aGnssStatusIpV6.ipV6Addr[0]), in6->sin6_addr.s6_addr,
                           aGnssStatusIpV6.ipV6Addr.size());
                    sAGnssCbIface->agnssStatusIpV6Cb(aGnssStatusIpV6);
                    auto ret = sAGnssCbIface->agnssStatusIpV6Cb(aGnssStatusIpV6);
                    if (!ret.isOk()) {
                        ALOGE("%s: Unable to invoke callback", __func__);
                    }
                    break;
                }
             default:
@@ -117,7 +124,10 @@ void AGnss::statusCb(AGpsStatus* status) {
        /*
         * Callback to client with agnssStatusIpV4Cb.
         */
        sAGnssCbIface->agnssStatusIpV4Cb(aGnssStatusIpV4);
        auto ret = sAGnssCbIface->agnssStatusIpV4Cb(aGnssStatusIpV4);
        if (!ret.isOk()) {
            ALOGE("%s: Unable to invoke callback", __func__);
        }
    } else {
        ALOGE("%s: Invalid size for AGPS Status", __func__);
    }
+9 −2
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ AGnssRil::AGnssRil(const AGpsRilInterface* aGpsRilIface) : mAGnssRilIface(aGpsRi

AGnssRil::~AGnssRil() {
    sThreadFuncArgsList.clear();
    sInterfaceExists = false;
}

void AGnssRil::requestSetId(uint32_t flags) {
@@ -50,7 +51,10 @@ void AGnssRil::requestSetId(uint32_t flags) {
        return;
    }

    sAGnssRilCbIface->requestSetIdCb(flags);
    auto ret = sAGnssRilCbIface->requestSetIdCb(flags);
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

void AGnssRil::requestRefLoc(uint32_t /*flags*/) {
@@ -59,7 +63,10 @@ void AGnssRil::requestRefLoc(uint32_t /*flags*/) {
        return;
    }

    sAGnssRilCbIface->requestRefLocCb();
    auto ret = sAGnssRilCbIface->requestRefLocCb();
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

pthread_t AGnssRil::createThreadCb(const char* name, void (*start)(void*), void* arg) {
+82 −20
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ Gnss::Gnss(gps_device_t* gnssDevice) {
}

Gnss::~Gnss() {
    sInterfaceExists = false;
    sThreadFuncArgsList.clear();
}

@@ -75,7 +76,10 @@ void Gnss::locationCb(GpsLocation* location) {
    }

    android::hardware::gnss::V1_0::GnssLocation gnssLocation = convertToGnssLocation(location);
    sGnssCbIface->gnssLocationCb(gnssLocation);
    auto ret = sGnssCbIface->gnssLocationCb(gnssLocation);
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

void Gnss::statusCb(GpsStatus* gnssStatus) {
@@ -92,7 +96,10 @@ void Gnss::statusCb(GpsStatus* gnssStatus) {
    IGnssCallback::GnssStatusValue status =
            static_cast<IGnssCallback::GnssStatusValue>(gnssStatus->status);

    sGnssCbIface->gnssStatusCb(status);
    auto ret = sGnssCbIface->gnssStatusCb(status);
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

void Gnss::gnssSvStatusCb(GnssSvStatus* status) {
@@ -131,7 +138,10 @@ void Gnss::gnssSvStatusCb(GnssSvStatus* status) {
        svStatus.gnssSvList[i] = gnssSvInfo;
    }

    sGnssCbIface->gnssSvStatusCb(svStatus);
    auto ret = sGnssCbIface->gnssSvStatusCb(svStatus);
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

/*
@@ -231,7 +241,10 @@ void Gnss::gpsSvStatusCb(GpsSvStatus* svInfo) {
        }
    }

    sGnssCbIface->gnssSvStatusCb(svStatus);
    auto ret = sGnssCbIface->gnssSvStatusCb(svStatus);
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

void Gnss::nmeaCb(GpsUtcTime timestamp, const char* nmea, int length) {
@@ -242,7 +255,10 @@ void Gnss::nmeaCb(GpsUtcTime timestamp, const char* nmea, int length) {

    android::hardware::hidl_string nmeaString;
    nmeaString.setToExternal(nmea, length);
    sGnssCbIface->gnssNmeaCb(timestamp, nmeaString);
    auto ret = sGnssCbIface->gnssNmeaCb(timestamp, nmeaString);
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

void Gnss::setCapabilitiesCb(uint32_t capabilities) {
@@ -251,7 +267,10 @@ void Gnss::setCapabilitiesCb(uint32_t capabilities) {
        return;
    }

    sGnssCbIface->gnssSetCapabilitesCb(capabilities);
    auto ret = sGnssCbIface->gnssSetCapabilitesCb(capabilities);
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

void Gnss::acquireWakelockCb() {
@@ -298,7 +317,10 @@ void Gnss::updateWakelock() {
            ALOGI("%s: GNSS HAL Wakelock acquired due to gps: %d, fused: %d", __func__,
                    sWakelockHeldGnss, sWakelockHeldFused);
            sWakelockHeld = true;
            sGnssCbIface->gnssAcquireWakelockCb();
            auto ret = sGnssCbIface->gnssAcquireWakelockCb();
            if (!ret.isOk()) {
                ALOGE("%s: Unable to invoke callback", __func__);
            }
        }
    } else {
        if (sWakelockHeld) {
@@ -309,7 +331,10 @@ void Gnss::updateWakelock() {
            ALOGW("%s: GNSS HAL Wakelock released, duplicate request", __func__);
        }
        sWakelockHeld = false;
        sGnssCbIface->gnssReleaseWakelockCb();
        auto ret = sGnssCbIface->gnssReleaseWakelockCb();
        if (!ret.isOk()) {
            ALOGE("%s: Unable to invoke callback", __func__);
        }
    }
}

@@ -319,7 +344,10 @@ void Gnss::requestUtcTimeCb() {
        return;
    }

    sGnssCbIface->gnssRequestTimeCb();
    auto ret = sGnssCbIface->gnssRequestTimeCb();
    if (!ret.isOk()) {
            ALOGE("%s: Unable to invoke callback", __func__);
    }
}

pthread_t Gnss::createThreadCb(const char* name, void (*start)(void*), void* arg) {
@@ -341,7 +369,10 @@ void Gnss::setSystemInfoCb(const LegacyGnssSystemInfo* info) {
        .yearOfHw = info->year_of_hw
    };

    sGnssCbIface->gnssSetSystemInfoCb(gnssInfo);
    auto ret = sGnssCbIface->gnssSetSystemInfoCb(gnssInfo);
    if (!ret.isOk()) {
            ALOGE("%s: Unable to invoke callback", __func__);
    }
}


@@ -434,7 +465,10 @@ Return<bool> Gnss::setPositionMode(IGnss::GnssPositionMode mode,
Return<sp<IAGnssRil>> Gnss::getExtensionAGnssRil()  {
    if (mGnssIface == nullptr) {
        ALOGE("%s: Gnss interface is unavailable", __func__);
    } else {
        return nullptr;
    }

    if (mGnssRil == nullptr) {
        const AGpsRilInterface* agpsRilIface = static_cast<const AGpsRilInterface*>(
                mGnssIface->get_extension(AGPS_RIL_INTERFACE));
        if (agpsRilIface == nullptr) {
@@ -449,7 +483,10 @@ Return<sp<IAGnssRil>> Gnss::getExtensionAGnssRil() {
Return<sp<IGnssConfiguration>> Gnss::getExtensionGnssConfiguration()  {
    if (mGnssIface == nullptr) {
        ALOGE("%s: Gnss interface is unavailable", __func__);
    } else {
        return nullptr;
    }

    if (mGnssConfig == nullptr) {
        const GnssConfigurationInterface* gnssConfigIface =
                static_cast<const GnssConfigurationInterface*>(
                        mGnssIface->get_extension(GNSS_CONFIGURATION_INTERFACE));
@@ -462,10 +499,14 @@ Return<sp<IGnssConfiguration>> Gnss::getExtensionGnssConfiguration() {
    }
    return mGnssConfig;
}

Return<sp<IGnssGeofencing>> Gnss::getExtensionGnssGeofencing()  {
    if (mGnssIface == nullptr) {
        ALOGE("%s: Gnss interface is unavailable", __func__);
    } else {
        return nullptr;
    }

    if (mGnssGeofencingIface == nullptr) {
        const GpsGeofencingInterface* gpsGeofencingIface =
                static_cast<const GpsGeofencingInterface*>(
                        mGnssIface->get_extension(GPS_GEOFENCING_INTERFACE));
@@ -483,7 +524,10 @@ Return<sp<IGnssGeofencing>> Gnss::getExtensionGnssGeofencing() {
Return<sp<IAGnss>> Gnss::getExtensionAGnss()  {
    if (mGnssIface == nullptr) {
        ALOGE("%s: Gnss interface is unavailable", __func__);
    } else {
        return nullptr;
    }

    if (mAGnssIface == nullptr) {
        const AGpsInterface* agpsIface = static_cast<const AGpsInterface*>(
                mGnssIface->get_extension(AGPS_INTERFACE));
        if (agpsIface == nullptr) {
@@ -498,7 +542,10 @@ Return<sp<IAGnss>> Gnss::getExtensionAGnss() {
Return<sp<IGnssNi>> Gnss::getExtensionGnssNi()  {
    if (mGnssIface == nullptr) {
        ALOGE("%s: Gnss interface is unavailable", __func__);
    } else {
        return nullptr;
    }

    if (mGnssNi == nullptr) {
        const GpsNiInterface* gpsNiIface = static_cast<const GpsNiInterface*>(
                mGnssIface->get_extension(GPS_NI_INTERFACE));
        if (gpsNiIface == nullptr) {
@@ -513,7 +560,10 @@ Return<sp<IGnssNi>> Gnss::getExtensionGnssNi() {
Return<sp<IGnssMeasurement>> Gnss::getExtensionGnssMeasurement() {
    if (mGnssIface == nullptr) {
        ALOGE("%s: Gnss interface is unavailable", __func__);
    } else {
        return nullptr;
    }

    if (mGnssMeasurement == nullptr) {
        const GpsMeasurementInterface* gpsMeasurementIface =
                static_cast<const GpsMeasurementInterface*>(
                        mGnssIface->get_extension(GPS_MEASUREMENT_INTERFACE));
@@ -530,7 +580,10 @@ Return<sp<IGnssMeasurement>> Gnss::getExtensionGnssMeasurement() {
Return<sp<IGnssNavigationMessage>> Gnss::getExtensionGnssNavigationMessage() {
    if (mGnssIface == nullptr) {
        ALOGE("%s: Gnss interface is unavailable", __func__);
    } else {
        return nullptr;
    }

    if (mGnssNavigationMessage == nullptr) {
        const GpsNavigationMessageInterface* gpsNavigationMessageIface =
                static_cast<const GpsNavigationMessageInterface*>(
                        mGnssIface->get_extension(GPS_NAVIGATION_MESSAGE_INTERFACE));
@@ -549,7 +602,10 @@ Return<sp<IGnssNavigationMessage>> Gnss::getExtensionGnssNavigationMessage() {
Return<sp<IGnssXtra>> Gnss::getExtensionXtra()  {
    if (mGnssIface == nullptr) {
        ALOGE("%s: Gnss interface is unavailable", __func__);
    } else {
        return nullptr;
    }

    if (mGnssXtraIface == nullptr) {
        const GpsXtraInterface* gpsXtraIface = static_cast<const GpsXtraInterface*>(
                mGnssIface->get_extension(GPS_XTRA_INTERFACE));

@@ -566,7 +622,10 @@ Return<sp<IGnssXtra>> Gnss::getExtensionXtra() {
Return<sp<IGnssDebug>> Gnss::getExtensionGnssDebug()  {
    if (mGnssIface == nullptr) {
        ALOGE("%s: Gnss interface is unavailable", __func__);
    } else {
        return nullptr;
    }

    if (mGnssDebug == nullptr) {
        const GpsDebugInterface* gpsDebugIface = static_cast<const GpsDebugInterface*>(
                mGnssIface->get_extension(GPS_DEBUG_INTERFACE));

@@ -583,7 +642,10 @@ Return<sp<IGnssDebug>> Gnss::getExtensionGnssDebug() {
Return<sp<IGnssBatching>> Gnss::getExtensionGnssBatching()  {
    if (mGnssIface == nullptr) {
        ALOGE("%s: Gnss interface is unavailable", __func__);
    } else {
        return nullptr;
    }

    if (mGnssBatching == nullptr) {
        hw_module_t* module;
        const FlpLocationInterface* flpLocationIface = nullptr;
        int err = hw_get_module(FUSED_LOCATION_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
+4 −1
Original line number Diff line number Diff line
@@ -103,7 +103,10 @@ void GnssBatching::locationCb(int32_t locationsCount, FlpLocation** locations) {
        gnssLocations.push_back(convertToGnssLocation(locations[iLocation]));
    }

    sGnssBatchingCbIface->gnssLocationBatchCb(gnssLocations);
    auto ret = sGnssBatchingCbIface->gnssLocationBatchCb(gnssLocations);
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

void GnssBatching::acquireWakelockCb() {
+26 −7
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ GnssGeofencing::GnssGeofencing(const GpsGeofencingInterface* gpsGeofencingIface)

GnssGeofencing::~GnssGeofencing() {
    sThreadFuncArgsList.clear();
    sInterfaceExists = false;
}
void GnssGeofencing::gnssGfTransitionCb(int32_t geofenceId,
                                        GpsLocation* location,
@@ -64,11 +65,14 @@ void GnssGeofencing::gnssGfTransitionCb(int32_t geofenceId,
    }

    GnssLocation gnssLocation = convertToGnssLocation(location);
    mGnssGeofencingCbIface->gnssGeofenceTransitionCb(
    auto ret = mGnssGeofencingCbIface->gnssGeofenceTransitionCb(
            geofenceId,
            gnssLocation,
            static_cast<IGnssGeofenceCallback::GeofenceTransition>(transition),
            timestamp);
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

void GnssGeofencing::gnssGfStatusCb(int32_t status, GpsLocation* location) {
@@ -85,8 +89,11 @@ void GnssGeofencing::gnssGfStatusCb(int32_t status, GpsLocation* location) {
        gnssLocation = {};
    }

    mGnssGeofencingCbIface->gnssGeofenceStatusCb(
    auto ret = mGnssGeofencingCbIface->gnssGeofenceStatusCb(
            static_cast<IGnssGeofenceCallback::GeofenceAvailability>(status), gnssLocation);
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

void GnssGeofencing::gnssGfAddCb(int32_t geofenceId, int32_t status) {
@@ -95,8 +102,11 @@ void GnssGeofencing::gnssGfAddCb(int32_t geofenceId, int32_t status) {
        return;
    }

    mGnssGeofencingCbIface->gnssGeofenceAddCb(
    auto ret = mGnssGeofencingCbIface->gnssGeofenceAddCb(
            geofenceId, static_cast<IGnssGeofenceCallback::GeofenceStatus>(status));
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

void GnssGeofencing::gnssGfRemoveCb(int32_t geofenceId, int32_t status) {
@@ -105,8 +115,11 @@ void GnssGeofencing::gnssGfRemoveCb(int32_t geofenceId, int32_t status) {
        return;
    }

    mGnssGeofencingCbIface->gnssGeofenceRemoveCb(
    auto ret = mGnssGeofencingCbIface->gnssGeofenceRemoveCb(
            geofenceId, static_cast<IGnssGeofenceCallback::GeofenceStatus>(status));
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

void GnssGeofencing::gnssGfPauseCb(int32_t geofenceId, int32_t status) {
@@ -115,8 +128,11 @@ void GnssGeofencing::gnssGfPauseCb(int32_t geofenceId, int32_t status) {
        return;
    }

    mGnssGeofencingCbIface->gnssGeofencePauseCb(
    auto ret = mGnssGeofencingCbIface->gnssGeofencePauseCb(
            geofenceId, static_cast<IGnssGeofenceCallback::GeofenceStatus>(status));
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

void GnssGeofencing::gnssGfResumeCb(int32_t geofenceId, int32_t status) {
@@ -125,8 +141,11 @@ void GnssGeofencing::gnssGfResumeCb(int32_t geofenceId, int32_t status) {
        return;
    }

    mGnssGeofencingCbIface->gnssGeofenceResumeCb(
    auto ret = mGnssGeofencingCbIface->gnssGeofenceResumeCb(
            geofenceId, static_cast<IGnssGeofenceCallback::GeofenceStatus>(status));
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
    }
}

pthread_t GnssGeofencing::createThreadCb(const char* name, void (*start)(void*), void* arg) {
Loading