summaryrefslogtreecommitdiffstats
path: root/services/camera
diff options
context:
space:
mode:
authorZhijun He <zhijunhe@google.com>2014-04-21 16:04:17 -0700
committerZhijun He <zhijunhe@google.com>2014-04-21 23:41:45 +0000
commit7ef20390ba4375c4b08edd14923846086987a8c8 (patch)
treea95af2cb1432f7cba15e779dc23d9674500250bf /services/camera
parente7ec24c9934c98a451e986a07651992df7fe6558 (diff)
downloadframeworks_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.cpp8
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();
}