cameraserver: Avoiding deadlocks while calling isPublicallyHiddenSecureCamera().
The following scenario can occur: T1 serving Client A's disconnect() call: T2 : serving Client B's connect() call T2 : CameraProviderManager::openSession() locks mInterfaceMutex and waits on open() HAL interface call T1: updateStatus() locks mStatusListenerMutex T1: CameraProviderManager::isPublicallyHiddenSecureCamera() waits on mInterfaceMutex T2: while waiting on open(), gets a torchModeStatus() callback from the camera HAL T2: onStatusChanged() T2: broadcastTorchModeStatus() which waits on mStatusListenerMutex As a result there's a possible circular hold and wait between T1 and T2. We cache isPublicallyHiddenSecureCamera in CameraState. That doesn't completely avoid having to hold mInterfaceLock while calling isPublicallyHiddenSecureCamera() in CameraService (cache updates), instead it reduces it. We instead need to hold mCameraStates lock which has a smaller scope. Bug: 141756275 Test: CTS Test: GCA (sanity) Merged-In: I8562c83478b1fe8fbda7c85f97b995985666918d Merged-In: I4a697c1eaccc3603007be4a595febea981fbeb64 Change-Id: Ie5508afb126a874f76fbbfc2dd19ef79ae6255e0 (cherry picked from commit fd39db81) Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
Loading
Please register or sign in to comment