diff options
author | Zhijun He <zhijunhe@google.com> | 2014-04-21 16:04:17 -0700 |
---|---|---|
committer | Zhijun He <zhijunhe@google.com> | 2014-04-21 23:41:45 +0000 |
commit | 7ef20390ba4375c4b08edd14923846086987a8c8 (patch) | |
tree | a95af2cb1432f7cba15e779dc23d9674500250bf /services/camera | |
parent | e7ec24c9934c98a451e986a07651992df7fe6558 (diff) | |
download | frameworks_av-7ef20390ba4375c4b08edd14923846086987a8c8.zip frameworks_av-7ef20390ba4375c4b08edd14923846086987a8c8.tar.gz frameworks_av-7ef20390ba4375c4b08edd14923846086987a8c8.tar.bz2 |
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
Diffstat (limited to 'services/camera')
-rw-r--r-- | services/camera/libcameraservice/device3/Camera3Device.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
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(); } |