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
This commit is contained in:
Yahan Zhou 2017-06-22 17:04:41 -07:00 committed by Yin-Chia Yeh
parent 11ec393689
commit 77dd4aaad3
2 changed files with 9 additions and 4 deletions

View file

@ -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

View file

@ -222,6 +222,7 @@ private:
static status_t getStatusT(const Status& s);
Status initStatus() const;
void closeLocked();
};
} // namespace implementation