Camera: Fix deadlock caused by ordering of mStatusLock and mCameraStatesLock.
The following lock order exists in addListenerHelper:
mCameraStatesLock -> mStatusLock. In CameraDeviceClient::disconnect()
the previous lock ordering was mStatusLock->mCameraStates lock. Move the
collection of logical camera ids out to avoid holding mCameraStatesLock
and mStatus lock in CameraService::updateStatus.
Bug: 162192331
Test: Camera cts
Test: GCA (basic validity)
Change-Id: Ie5f9f924a77f7073264e9b7fce739c74c98fb57a
Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h
index 4321201..685ed5e 100644
--- a/services/camera/libcameraservice/CameraService.h
+++ b/services/camera/libcameraservice/CameraService.h
@@ -49,6 +49,7 @@
#include <set>
#include <string>
+#include <list>
#include <map>
#include <memory>
#include <utility>
@@ -1005,8 +1006,13 @@
hardware::camera::common::V1_0::TorchModeStatus status);
// notify physical camera status when the physical camera is public.
- void notifyPhysicalCameraStatusLocked(int32_t status, const String8& cameraId,
- SystemCameraKind deviceKind);
+ // Expects mStatusListenerLock to be locked.
+ void notifyPhysicalCameraStatusLocked(int32_t status, const String16& physicalCameraId,
+ const std::list<String16>& logicalCameraIds, SystemCameraKind deviceKind);
+
+ // get list of logical cameras which are backed by physicalCameraId
+ std::list<String16> getLogicalCameras(const String8& physicalCameraId);
+
// IBinder::DeathRecipient implementation
virtual void binderDied(const wp<IBinder> &who);