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

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

RESTRICT AUTOMERGE: Camera: fix wrong signalStreamFlush call

Sometimes the waitUntilIdle call will finish without RequestThread
sending the signalStreamFlush call down to HAL.
Reset the flag when the wait finishes to avoid a wrong call fired
later when the request thread goes to paused.

Test: CTS on Pixel 3, partner testing
Bug: 162062652
Change-Id: I7c6674860a688f0bc42d4083793514b546cbd65d
parent 853e7579
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -2226,10 +2226,12 @@ status_t Camera3Device::waitUntilStateThenRelock(bool active, nsecs_t timeout) {

    mStatusWaiters++;

    bool signalPipelineDrain = false;
    if (!active && mUseHalBufManager) {
        auto streamIds = mOutputStreams.getStreamIds();
        if (mStatus == STATUS_ACTIVE) {
            mRequestThread->signalPipelineDrain(streamIds);
            signalPipelineDrain = true;
        }
        mRequestBufferSM.onWaitUntilIdle();
    }
@@ -2259,6 +2261,10 @@ status_t Camera3Device::waitUntilStateThenRelock(bool active, nsecs_t timeout) {
        }
    } while (!stateSeen);

    if (signalPipelineDrain) {
        mRequestThread->resetPipelineDrain();
    }

    mStatusWaiters--;

    return res;
@@ -5884,6 +5890,12 @@ void Camera3Device::RequestThread::signalPipelineDrain(const std::vector<int>& s
    mStreamIdsToBeDrained = streamIds;
}

void Camera3Device::RequestThread::resetPipelineDrain() {
    Mutex::Autolock pl(mPauseLock);
    mNotifyPipelineDrain = false;
    mStreamIdsToBeDrained.clear();
}

nsecs_t Camera3Device::getExpectedInFlightDuration() {
    ATRACE_CALL();
    Mutex::Autolock al(mInFlightLock);
+1 −0
Original line number Diff line number Diff line
@@ -838,6 +838,7 @@ class Camera3Device :
        }

        void signalPipelineDrain(const std::vector<int>& streamIds);
        void resetPipelineDrain();

      protected: