From 69a374897392c8bd70f441b7284f6f578c651ec9 Mon Sep 17 00:00:00 2001 From: Zhijun He Date: Sun, 23 Mar 2014 18:44:49 -0700 Subject: Camera3: Fix flush call deadlock Flush shouldn't call waitUntilDrained directly, as they are all API calls with mLock and mInterfaceLock held. Move the waitUntilDrained implementation into waitUntilDrainedLocked to solve this issue. Change-Id: Id7d931091d5c11e12204790841097433515446db --- services/camera/libcameraservice/device3/Camera3Device.cpp | 6 +++++- services/camera/libcameraservice/device3/Camera3Device.h | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'services/camera') diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index e5ac037..efc1bc7 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -997,6 +997,10 @@ status_t Camera3Device::waitUntilDrained() { Mutex::Autolock il(mInterfaceLock); Mutex::Autolock l(mLock); + return waitUntilDrainedLocked(); +} + +status_t Camera3Device::waitUntilDrainedLocked() { switch (mStatus) { case STATUS_UNINITIALIZED: case STATUS_UNCONFIGURED: @@ -1207,7 +1211,7 @@ status_t Camera3Device::flush() { if (mHal3Device->common.version >= CAMERA_DEVICE_API_VERSION_3_1) { res = mHal3Device->ops->flush(mHal3Device); } else { - res = waitUntilDrained(); + res = waitUntilDrainedLocked(); } return res; diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h index 44c6260..7ea8bcf 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -246,6 +246,13 @@ class Camera3Device : status_t waitUntilStateThenRelock(bool active, nsecs_t timeout); /** + * Implementation of waitUntilDrained. On success, will transition to IDLE state. + * + * Need to be called with mLock and mInterfaceLock held. + */ + status_t waitUntilDrainedLocked(); + + /** * Do common work for setting up a streaming or single capture request. * On success, will transition to ACTIVE if in IDLE. */ -- cgit v1.1