camera3: Don't hold mLock during flush call
HAL calls into Camera3Device functions like processCaptureResult during flush
call. When Camera3Device runs into error state during flush call,
processCaptureResult calls setErrorState(), which leads to deadlock.
Change-Id: I35a03f6eb4b77f914097917cb37de98663de365f
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 729020b..c7abe3a 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -1162,13 +1162,17 @@
ATRACE_CALL();
ALOGV("%s: Camera %d: Flushing all requests", __FUNCTION__, mId);
Mutex::Autolock il(mInterfaceLock);
- Mutex::Autolock l(mLock);
- mRequestThread->clear(/*out*/frameNumber);
+ {
+ Mutex::Autolock l(mLock);
+ mRequestThread->clear(/*out*/frameNumber);
+ }
+
status_t res;
if (mHal3Device->common.version >= CAMERA_DEVICE_API_VERSION_3_1) {
res = mHal3Device->ops->flush(mHal3Device);
} else {
+ Mutex::Autolock l(mLock);
res = waitUntilDrainedLocked();
}