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

Commit ca3fb120 authored by Igor Murashkin's avatar Igor Murashkin Committed by Android (Google) Code Review
Browse files

Merge "camera3: Fix zsl buffers released-while-in-use race condition" into jb-mr2-dev

parents 1f7f83b7 efb0fd23
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -413,6 +413,8 @@ nsecs_t ZslProcessor3::getCandidateTimestampLocked(size_t* metadataIdx) const {
                minTimestamp = frameTimestamp;
                minTimestamp = frameTimestamp;
                idx = j;
                idx = j;
            }
            }

            ALOGVV("%s: Saw timestamp %lld", __FUNCTION__, frameTimestamp);
        }
        }
    }
    }


+18 −12
Original line number Original line Diff line number Diff line
@@ -101,12 +101,6 @@ sp<PinnedBufferItem> RingBufferConsumer::pinSelectedBuffer(


    } // end scope of mMutex autolock
    } // end scope of mMutex autolock


    if (pinnedBuffer != 0) {
        BI_LOGV("Pinned buffer frame %lld, timestamp %lld",
                pinnedBuffer->getBufferItem().mFrameNumber,
                pinnedBuffer->getBufferItem().mTimestamp);
    }

    if (waitForFence) {
    if (waitForFence) {
        status_t err = pinnedBuffer->getBufferItem().mFence->waitForever(
        status_t err = pinnedBuffer->getBufferItem().mFence->waitForever(
                "RingBufferConsumer::pinSelectedBuffer");
                "RingBufferConsumer::pinSelectedBuffer");
@@ -172,6 +166,9 @@ void RingBufferConsumer::pinBufferLocked(const BufferItem& item) {
    if (it == end) {
    if (it == end) {
        BI_LOGE("Failed to pin buffer (timestamp %lld, framenumber %lld)",
        BI_LOGE("Failed to pin buffer (timestamp %lld, framenumber %lld)",
                 item.mTimestamp, item.mFrameNumber);
                 item.mTimestamp, item.mFrameNumber);
    } else {
        BI_LOGV("Pinned buffer (frame %lld, timestamp %lld)",
                item.mFrameNumber, item.mTimestamp);
    }
    }
}
}


@@ -182,7 +179,7 @@ status_t RingBufferConsumer::releaseOldestBufferLocked(size_t* pinnedFrames) {


    it = mBufferItemList.begin();
    it = mBufferItemList.begin();
    end = mBufferItemList.end();
    end = mBufferItemList.end();
    accIt = it;
    accIt = end;


    if (it == end) {
    if (it == end) {
        /**
        /**
@@ -197,13 +194,18 @@ status_t RingBufferConsumer::releaseOldestBufferLocked(size_t* pinnedFrames) {


    for (; it != end; ++it) {
    for (; it != end; ++it) {
        RingBufferItem& find = *it;
        RingBufferItem& find = *it;
        if (find.mTimestamp < accIt->mTimestamp && find.mPinCount <= 0) {
            accIt = it;
        }


        if (find.mPinCount > 0 && pinnedFrames != NULL) {
        if (find.mPinCount > 0) {
            if (pinnedFrames != NULL) {
                ++(*pinnedFrames);
                ++(*pinnedFrames);
            }
            }
            // Filter out pinned frame when searching for buffer to release
            continue;
        }

        if (find.mTimestamp < accIt->mTimestamp || accIt == end) {
            accIt = it;
        }
    }
    }


    if (accIt != end) {
    if (accIt != end) {
@@ -323,7 +325,11 @@ void RingBufferConsumer::unpinBuffer(const BufferItem& item) {
    }
    }


    if (it == end) {
    if (it == end) {
        BI_LOGE("Failed to unpin buffer (timestamp %lld, framenumber %lld",
        // This should never happen. If it happens, we have a bug.
        BI_LOGE("Failed to unpin buffer (timestamp %lld, framenumber %lld)",
                 item.mTimestamp, item.mFrameNumber);
    } else {
        BI_LOGV("Unpinned buffer (timestamp %lld, framenumber %lld)",
                 item.mTimestamp, item.mFrameNumber);
                 item.mTimestamp, item.mFrameNumber);
    }
    }
}
}