Camera: Fix race condition for filterSPerfClassCharacteristics
1. enumerateProviders may be called from different threads: from
cameraserver startup, and from the provider's onRegistration.
When enumerateProviders calls filterSPerfClassCharacteristics,
mServiceLock needs to be held.
2. onRegistration can be called with preexisting set to TRUE. In that
case, do not call onNewProviderRegistered() to avoid unnecessary
enumerateProviders.
Test: vendor testing, camera CTS
Bug: 193796282
Change-Id: I596a047cb36a9926014de232a6639a32da4f214c
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp
index 7045128..4f2b878 100644
--- a/services/camera/libcameraservice/common/CameraProviderManager.cpp
+++ b/services/camera/libcameraservice/common/CameraProviderManager.cpp
@@ -476,15 +476,16 @@
const hardware::hidl_string& /*fqName*/,
const hardware::hidl_string& name,
bool preexisting) {
+ status_t res = OK;
std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
{
std::lock_guard<std::mutex> lock(mInterfaceMutex);
- addProviderLocked(name, preexisting);
+ res = addProviderLocked(name, preexisting);
}
sp<StatusListener> listener = getStatusListener();
- if (nullptr != listener.get()) {
+ if (nullptr != listener.get() && res == OK) {
listener->onNewProviderRegistered();
}