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

Commit 55fc8e7c authored by Yin-Chia Yeh's avatar Yin-Chia Yeh
Browse files

Camera NDK: fix release image failure during destructor

Test: new CTS test that close reader with images in
      acquired state
Bug: 65839749

Change-Id: Iac9d2b1a3298ca619f2ab71a02641052f9a51f2e
parent b92c988f
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -53,21 +53,25 @@ AImage::isClosed() const {

void
AImage::close(int releaseFenceFd) {
    lockReader();
    Mutex::Autolock _l(mLock);
    if (mIsClosed) {
        return;
    }
    sp<AImageReader> reader = mReader.promote();
    if (reader == nullptr) {
        LOG_ALWAYS_FATAL("Error: AImage not closed before AImageReader close!");
        return;
    }
    if (reader != nullptr) {
        reader->releaseImageLocked(this, releaseFenceFd);
    } else if (mBuffer != nullptr) {
        LOG_ALWAYS_FATAL("%s: parent AImageReader closed without releasing image %p",
                __FUNCTION__, this);
    }

    // Should have been set to nullptr in releaseImageLocked
    // Set to nullptr here for extra safety only
    mBuffer = nullptr;
    mLockedBuffer = nullptr;
    mIsClosed = true;
    unlockReader();
}

void
@@ -618,9 +622,7 @@ EXPORT
void AImage_deleteAsync(AImage* image, int releaseFenceFd) {
    ALOGV("%s", __FUNCTION__);
    if (image != nullptr) {
        image->lockReader();
        image->close(releaseFenceFd);
        image->unlockReader();
        if (!image->isClosed()) {
            LOG_ALWAYS_FATAL("Image close failed!");
        }
+1 −0
Original line number Diff line number Diff line
@@ -349,6 +349,7 @@ AImageReader::~AImageReader() {
    for (auto it = mAcquiredImages.begin();
              it != mAcquiredImages.end(); it++) {
        AImage* image = *it;
        releaseImageLocked(image, /*releaseFenceFd*/-1);
        image->close();
    }