Fix deadlock in cuttlefish/default implementation

Bug: 150830099

Test: atest LocationManagerFineTest#testRegisterGnssMeasurementsCallback
-c --iterations 100

Change-Id: I70aec19a481781d924ed3008765ca624a7eeb950
Merged-In: I70aec19a481781d924ed3008765ca624a7eeb950

(cherry picked from commit 3d652709ed)
This commit is contained in:
Yu-Han Yang
2020-03-05 22:41:23 -08:00
parent 77d161d09e
commit f3cb5562b2
6 changed files with 18 additions and 4 deletions

View File

@@ -49,8 +49,8 @@ Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallba
Return<void> GnssMeasurement::close() {
ALOGD("close");
std::unique_lock<std::mutex> lock(mMutex);
stop();
std::unique_lock<std::mutex> lock(mMutex);
sCallback = nullptr;
return Void();
}

View File

@@ -61,10 +61,14 @@ struct GnssMeasurement : public IGnssMeasurement {
void stop();
void reportMeasurement(const GnssData&);
// Guarded by mMutex
static sp<IGnssMeasurementCallback> sCallback;
std::atomic<long> mMinIntervalMillis;
std::atomic<bool> mIsActive;
std::thread mThread;
// Synchronization lock for sCallback
mutable std::mutex mMutex;
};

View File

@@ -55,8 +55,8 @@ Return<GnssAntennaInfo::GnssAntennaInfoStatus> GnssAntennaInfo::setCallback(
Return<void> GnssAntennaInfo::close() {
ALOGD("close");
std::unique_lock<std::mutex> lock(mMutex);
stop();
std::unique_lock<std::mutex> lock(mMutex);
sCallback = nullptr;
return Void();
}

View File

@@ -47,10 +47,14 @@ struct GnssAntennaInfo : public IGnssAntennaInfo {
void reportAntennaInfo(
const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& antennaInfo) const;
// Guarded by mMutex
static sp<IGnssAntennaInfoCallback> sCallback;
std::atomic<long> mMinIntervalMillis;
std::atomic<bool> mIsActive;
std::thread mThread;
// Synchronization lock for sCallback
mutable std::mutex mMutex;
};
@@ -60,4 +64,4 @@ struct GnssAntennaInfo : public IGnssAntennaInfo {
} // namespace hardware
} // namespace android
#endif // ANDROID_HARDWARE_GNSS_V2_1_GNSSCONFIGURATION_H
#endif // ANDROID_HARDWARE_GNSS_V2_1_GNSSCONFIGURATION_H

View File

@@ -47,8 +47,8 @@ Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallba
Return<void> GnssMeasurement::close() {
ALOGD("close");
std::unique_lock<std::mutex> lock(mMutex);
stop();
std::unique_lock<std::mutex> lock(mMutex);
sCallback_2_1 = nullptr;
sCallback_2_0 = nullptr;
return Void();

View File

@@ -66,11 +66,17 @@ struct GnssMeasurement : public IGnssMeasurement {
void reportMeasurement(const GnssDataV2_0&);
void reportMeasurement(const GnssDataV2_1&);
// Guarded by mMutex
static sp<V2_1::IGnssMeasurementCallback> sCallback_2_1;
// Guarded by mMutex
static sp<V2_0::IGnssMeasurementCallback> sCallback_2_0;
std::atomic<long> mMinIntervalMillis;
std::atomic<bool> mIsActive;
std::thread mThread;
// Synchronization lock for sCallback_2_1 and sCallback_2_0
mutable std::mutex mMutex;
};