Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 77dd4aaa authored by Yahan Zhou's avatar Yahan Zhou Committed by Yin-Chia Yeh
Browse files

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
parent 11ec3936
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -222,6 +222,7 @@ private:
    static status_t getStatusT(const Status& s);

    Status initStatus() const;
    void closeLocked();
};

}  // namespace implementation