From 7ef20390ba4375c4b08edd14923846086987a8c8 Mon Sep 17 00:00:00 2001 From: Zhijun He Date: Mon, 21 Apr 2014 16:04:17 -0700 Subject: 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 --- services/camera/libcameraservice/device3/Camera3Device.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'services/camera') 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 @@ status_t Camera3Device::flush(int64_t *frameNumber) { 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(); } -- cgit v1.1