diff options
author | Yahan Zhou <yahan@google.com> | 2017-06-22 17:04:41 -0700 |
---|---|---|
committer | Yin-Chia Yeh <yinchiayeh@google.com> | 2017-06-23 00:28:11 +0000 |
commit | 77dd4aaad3d71a31a8b546758d8ee09e9b50d6e0 (patch) | |
tree | 09750190d5b24a3bf73eca775ba4bb18b5346e2e /camera/device/1.0/default/CameraDevice.cpp | |
parent | 11ec3936891cb483f7db19945e9b1af8d7f3f1ed (diff) |
Camera: fix recursive lock in CameraDevice 1.0
Several functions call close() while they are holding a lock, which
results in recursive locking. This CL implements close_locked() to avoid
such behavior.
Bug: 62919192
Test: run vts -m VtsHalCameraProviderV2_4Target, and camera should still
work after it
Change-Id: Ib38e1de19ed3c927bfb645c0c777c04f157f2b88
Diffstat (limited to 'camera/device/1.0/default/CameraDevice.cpp')
-rw-r--r-- | camera/device/1.0/default/CameraDevice.cpp | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/camera/device/1.0/default/CameraDevice.cpp b/camera/device/1.0/default/CameraDevice.cpp index 6f4e70f834..c53c0d8b56 100644 --- a/camera/device/1.0/default/CameraDevice.cpp +++ b/camera/device/1.0/default/CameraDevice.cpp @@ -116,7 +116,7 @@ CameraDevice::~CameraDevice() { Mutex::Autolock _l(mLock); if (mDevice != nullptr) { ALOGW("%s: camera %s is deleted while open", __FUNCTION__, mCameraId.c_str()); - close(); + closeLocked(); } mHalPreviewWindow.cleanUpCirculatingBuffers(); } @@ -130,7 +130,7 @@ void CameraDevice::setConnectionStatus(bool connected) { } if (!connected) { ALOGW("%s: camera %s is disconneted. Closing", __FUNCTION__, mCameraId.c_str()); - close(); + closeLocked(); } return; } @@ -982,8 +982,13 @@ Return<Status> CameraDevice::sendCommand(CommandType cmd, int32_t arg1, int32_t } Return<void> CameraDevice::close() { - ALOGI("Closing camera %s", mCameraId.c_str()); Mutex::Autolock _l(mLock); + closeLocked(); + return Void(); +} + +void CameraDevice::closeLocked() { + ALOGI("Closing camera %s", mCameraId.c_str()); if(mDevice) { int rc = mDevice->common.close(&mDevice->common); if (rc != OK) { @@ -991,7 +996,6 @@ Return<void> CameraDevice::close() { } mDevice = nullptr; } - return Void(); } } // namespace implementation |