From ec96060c3b4b4d793c6599204ae4f639d065a57d Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Tue, 15 Oct 2019 11:46:16 -0700 Subject: [PATCH] CameraService: Don't block on camera HAL start in all cases When initially starting up, use tryGetService instead of getService to avoid blocking camera service start in cases where the camera HAL is stuck. Test: atest cameraservice_test && atest CameraManagerTest, with and without lazy camera HAL Change-Id: I2ad5c542e77e748902cfb49f90a55620b29ad4cd --- .../libcameraservice/common/CameraProviderManager.cpp | 2 +- .../libcameraservice/common/CameraProviderManager.h | 8 ++++++++ .../libcameraservice/tests/CameraProviderManagerTest.cpp | 5 +++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp index 974026cbc9..77b8536edf 100644 --- a/services/camera/libcameraservice/common/CameraProviderManager.cpp +++ b/services/camera/libcameraservice/common/CameraProviderManager.cpp @@ -1154,7 +1154,7 @@ status_t CameraProviderManager::addProviderLocked(const std::string& newProvider } sp interface; - interface = mServiceProxy->getService(newProvider); + interface = mServiceProxy->tryGetService(newProvider); if (interface == nullptr) { ALOGE("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__, diff --git a/services/camera/libcameraservice/common/CameraProviderManager.h b/services/camera/libcameraservice/common/CameraProviderManager.h index f4cf6674f0..13a8513de5 100644 --- a/services/camera/libcameraservice/common/CameraProviderManager.h +++ b/services/camera/libcameraservice/common/CameraProviderManager.h @@ -96,6 +96,10 @@ public: const std::string &serviceName, const sp ¬ification) = 0; + // Will not wait for service to start if it's not already running + virtual sp tryGetService( + const std::string &serviceName) = 0; + // Will block for service if it exists but isn't running virtual sp getService( const std::string &serviceName) = 0; virtual hardware::hidl_vec listServices() = 0; @@ -112,6 +116,10 @@ public: return hardware::camera::provider::V2_4::ICameraProvider::registerForNotifications( serviceName, notification); } + virtual sp tryGetService( + const std::string &serviceName) override { + return hardware::camera::provider::V2_4::ICameraProvider::tryGetService(serviceName); + } virtual sp getService( const std::string &serviceName) override { return hardware::camera::provider::V2_4::ICameraProvider::getService(serviceName); diff --git a/services/camera/libcameraservice/tests/CameraProviderManagerTest.cpp b/services/camera/libcameraservice/tests/CameraProviderManagerTest.cpp index 78d737d1b2..ca275f4fe4 100644 --- a/services/camera/libcameraservice/tests/CameraProviderManagerTest.cpp +++ b/services/camera/libcameraservice/tests/CameraProviderManagerTest.cpp @@ -199,6 +199,11 @@ struct TestInteractionProxy : public CameraProviderManager::ServiceInteractionPr return true; } + virtual sp tryGetService( + const std::string &serviceName) override { + return getService(serviceName); + } + virtual sp getService( const std::string &serviceName) override { mLastRequestedServiceNames.push_back(serviceName);