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

Commit c9ca6788 authored by Shuzhen Wang's avatar Shuzhen Wang
Browse files

Camera: Use separate lock for mStreamingRequestId

There are cases where evictClientIdByRemote holds
mBinderSerializationLock and waits for mRequestLock, and at the same
time checkAndStopRepeatingRequest holds mRequestLock and waits for
mBinderSerializationLock, causing deadlock.

Solution is to use separate lock to protect mStreamingRequestId.

Bug: 28295136
Change-Id: I40f8e1ded29abde86bc12b20dd119f9f3371ebb2
parent 34713c04
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -234,6 +234,7 @@ binder::Status CameraDeviceClient::submitRequestList(
            res = STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION,
                    msg.string());
        } else {
            Mutex::Autolock idLock(mStreamingRequestIdLock);
            mStreamingRequestId = submitInfo->mRequestId;
        }
    } else {
@@ -271,6 +272,7 @@ binder::Status CameraDeviceClient::cancelRequest(
        return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive");
    }

    Mutex::Autolock idLock(mStreamingRequestIdLock);
    if (mStreamingRequestId != requestId) {
        String8 msg = String8::format("Camera %d: Canceling request ID %d doesn't match "
                "current request ID %d", mCameraId, requestId, mStreamingRequestId);
@@ -760,6 +762,7 @@ binder::Status CameraDeviceClient::waitUntilIdle()
    }

    // FIXME: Also need check repeating burst.
    Mutex::Autolock idLock(mStreamingRequestIdLock);
    if (mStreamingRequestId != REQUEST_ID_NONE) {
        String8 msg = String8::format(
            "Camera %d: Try to waitUntilIdle when there are active streaming requests",
@@ -792,6 +795,7 @@ binder::Status CameraDeviceClient::flush(
        return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive");
    }

    Mutex::Autolock idLock(mStreamingRequestIdLock);
    mStreamingRequestId = REQUEST_ID_NONE;
    status_t err = mDevice->flush(lastFrameNumber);
    if (err != OK) {
@@ -982,7 +986,7 @@ void CameraDeviceClient::notifyRepeatingRequestError(long lastFrameNumber) {
        remoteCb->onRepeatingRequestError(lastFrameNumber);
    }

    Mutex::Autolock icl(mBinderSerializationLock);
    Mutex::Autolock idLock(mStreamingRequestIdLock);
    mStreamingRequestId = REQUEST_ID_NONE;
}

+1 −0
Original line number Diff line number Diff line
@@ -208,6 +208,7 @@ private:

    // Streaming request ID
    int32_t mStreamingRequestId;
    Mutex mStreamingRequestIdLock;
    static const int32_t REQUEST_ID_NONE = -1;

    int32_t mRequestIdCounter;