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

Commit 5c2bdf6a authored by Yin-Chia Yeh's avatar Yin-Chia Yeh Committed by android-build-merger
Browse files

Merge "Camera: fix emulator deadlock" into oc-dr1-dev

am: 84201fee

Change-Id: Ie036606deb823fb8c33954fa76d37eee6d403e96
parents 49ef2a9a 84201fee
Loading
Loading
Loading
Loading
+50 −47
Original line number Diff line number Diff line
@@ -240,6 +240,7 @@ status_t Camera3Device::disconnect() {

    status_t res = OK;
    std::vector<wp<Camera3StreamInterface>> streams;
    nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
    {
        Mutex::Autolock l(mLock);
        if (mStatus == STATUS_UNINITIALIZED) return res;
@@ -251,7 +252,6 @@ status_t Camera3Device::disconnect() {
                SET_ERR_L("Can't stop streaming");
                // Continue to close device even in case of error
            } else {
                nsecs_t maxExpectedDuration = getExpectedInFlightDurationLocked();
                res = waitUntilStateThenRelock(/*active*/ false, maxExpectedDuration);
                if (res != OK) {
                    SET_ERR_L("Timeout waiting for HAL to drain (% " PRIi64 " ns)",
@@ -311,7 +311,6 @@ status_t Camera3Device::disconnect() {

    {
        Mutex::Autolock l(mLock);
        mExpectedInflightDuration = 0;
        mInterface->clear();
        mOutputStreams.clear();
        mInputStream.clear();
@@ -1142,6 +1141,7 @@ status_t Camera3Device::createInputStream(
        uint32_t width, uint32_t height, int format, int *id) {
    ATRACE_CALL();
    Mutex::Autolock il(mInterfaceLock);
    nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
    Mutex::Autolock l(mLock);
    ALOGV("Camera %s: Creating new input stream %d: %d x %d, format %d",
            mId.string(), mNextStreamId, width, height, format);
@@ -1162,7 +1162,7 @@ status_t Camera3Device::createInputStream(
            break;
        case STATUS_ACTIVE:
            ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
            res = internalPauseAndWaitLocked();
            res = internalPauseAndWaitLocked(maxExpectedDuration);
            if (res != OK) {
                SET_ERR_L("Can't pause captures to reconfigure streams!");
                return res;
@@ -1229,6 +1229,7 @@ status_t Camera3Device::createStream(const std::vector<sp<Surface>>& consumers,
        int streamSetId, bool isShared, uint32_t consumerUsage) {
    ATRACE_CALL();
    Mutex::Autolock il(mInterfaceLock);
    nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
    Mutex::Autolock l(mLock);
    ALOGV("Camera %s: Creating new stream %d: %d x %d, format %d, dataspace %d rotation %d"
            " consumer usage 0x%x, isShared %d", mId.string(), mNextStreamId, width, height, format,
@@ -1250,7 +1251,7 @@ status_t Camera3Device::createStream(const std::vector<sp<Surface>>& consumers,
            break;
        case STATUS_ACTIVE:
            ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
            res = internalPauseAndWaitLocked();
            res = internalPauseAndWaitLocked(maxExpectedDuration);
            if (res != OK) {
                SET_ERR_L("Can't pause captures to reconfigure streams!");
                return res;
@@ -1501,8 +1502,9 @@ status_t Camera3Device::createDefaultRequest(int templateId,
    }

    Mutex::Autolock il(mInterfaceLock);
    Mutex::Autolock l(mLock);

    {
        Mutex::Autolock l(mLock);
        switch (mStatus) {
            case STATUS_ERROR:
                CLOGE("Device has encountered a serious error");
@@ -1524,10 +1526,14 @@ status_t Camera3Device::createDefaultRequest(int templateId,
            *request = mRequestTemplateCache[templateId];
            return OK;
        }
    }

    camera_metadata_t *rawRequest;
    status_t res = mInterface->constructDefaultRequestSettings(
            (camera3_request_template_t) templateId, &rawRequest);

    {
        Mutex::Autolock l(mLock);
        if (res == BAD_VALUE) {
            ALOGI("%s: template %d is not supported on this camera device",
                  __FUNCTION__, templateId);
@@ -1542,18 +1548,20 @@ status_t Camera3Device::createDefaultRequest(int templateId,
        mRequestTemplateCache[templateId].acquire(rawRequest);

        *request = mRequestTemplateCache[templateId];
    }
    return OK;
}

status_t Camera3Device::waitUntilDrained() {
    ATRACE_CALL();
    Mutex::Autolock il(mInterfaceLock);
    nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
    Mutex::Autolock l(mLock);

    return waitUntilDrainedLocked();
    return waitUntilDrainedLocked(maxExpectedDuration);
}

status_t Camera3Device::waitUntilDrainedLocked() {
status_t Camera3Device::waitUntilDrainedLocked(nsecs_t maxExpectedDuration) {
    switch (mStatus) {
        case STATUS_UNINITIALIZED:
        case STATUS_UNCONFIGURED:
@@ -1569,9 +1577,6 @@ status_t Camera3Device::waitUntilDrainedLocked() {
            SET_ERR_L("Unexpected status: %d",mStatus);
            return INVALID_OPERATION;
    }

    nsecs_t maxExpectedDuration = getExpectedInFlightDurationLocked();

    ALOGV("%s: Camera %s: Waiting until idle (%" PRIi64 "ns)", __FUNCTION__, mId.string(),
            maxExpectedDuration);
    status_t res = waitUntilStateThenRelock(/*active*/ false, maxExpectedDuration);
@@ -1590,11 +1595,10 @@ void Camera3Device::internalUpdateStatusLocked(Status status) {
}

// Pause to reconfigure
status_t Camera3Device::internalPauseAndWaitLocked() {
status_t Camera3Device::internalPauseAndWaitLocked(nsecs_t maxExpectedDuration) {
    mRequestThread->setPaused(true);
    mPauseStateNotify = true;

    nsecs_t maxExpectedDuration = getExpectedInFlightDurationLocked();
    ALOGV("%s: Camera %s: Internal wait until idle (% " PRIi64 " ns)", __FUNCTION__, mId.string(),
          maxExpectedDuration);
    status_t res = waitUntilStateThenRelock(/*active*/ false, maxExpectedDuration);
@@ -2384,9 +2388,7 @@ status_t Camera3Device::registerInFlight(uint32_t frameNumber,
        }
    }

    Mutex::Autolock ml(mLock);
    mExpectedInflightDuration += maxExpectedDuration;

    return OK;
}

@@ -2418,7 +2420,6 @@ void Camera3Device::removeInFlightMapEntryLocked(int idx) {
            mStatusTracker->markComponentIdle(mInFlightStatusId, Fence::NO_FENCE);
        }
    }
    Mutex::Autolock l(mLock);
    mExpectedInflightDuration -= duration;
}

@@ -2500,6 +2501,7 @@ void Camera3Device::flushInflightRequests() {
                request.pendingOutputBuffers.size(), 0);
        }
        mInFlightMap.clear();
        mExpectedInflightDuration = 0;
    }

    // Then return all inflight buffers not returned by HAL
@@ -4294,7 +4296,8 @@ bool Camera3Device::RequestThread::isStreamPending(
    return false;
}

nsecs_t Camera3Device::getExpectedInFlightDurationLocked() {
nsecs_t Camera3Device::getExpectedInFlightDuration() {
    Mutex::Autolock al(mInFlightLock);
    return mExpectedInflightDuration > kMinInflightDuration ?
            mExpectedInflightDuration : kMinInflightDuration;
}
+8 −5
Original line number Diff line number Diff line
@@ -486,7 +486,7 @@ class Camera3Device :
     * CameraDeviceBase interface we shouldn't need to.
     * Must be called with mLock and mInterfaceLock both held.
     */
    status_t internalPauseAndWaitLocked();
    status_t internalPauseAndWaitLocked(nsecs_t maxExpectedDuration);

    /**
     * Resume work after internalPauseAndWaitLocked()
@@ -512,7 +512,7 @@ class Camera3Device :
     *
     * Need to be called with mLock and mInterfaceLock held.
     */
    status_t waitUntilDrainedLocked();
    status_t waitUntilDrainedLocked(nsecs_t maxExpectedDuration);

    /**
     * Do common work for setting up a streaming or single capture request.
@@ -915,11 +915,14 @@ class Camera3Device :
    // Map from frame number to the in-flight request state
    typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap;

    nsecs_t                mExpectedInflightDuration = 0;
    Mutex                  mInFlightLock; // Protects mInFlightMap

    Mutex                  mInFlightLock; // Protects mInFlightMap and
                                          // mExpectedInflightDuration
    InFlightMap            mInFlightMap;
    nsecs_t                mExpectedInflightDuration = 0;
    int                    mInFlightStatusId;


    status_t registerInFlight(uint32_t frameNumber,
            int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput,
            bool callback, nsecs_t maxExpectedDuration);
@@ -928,7 +931,7 @@ class Camera3Device :
     * Returns the maximum expected time it'll take for all currently in-flight
     * requests to complete, based on their settings
     */
    nsecs_t getExpectedInFlightDurationLocked();
    nsecs_t getExpectedInFlightDuration();

    /**
     * Tracking for idle detection