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
diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
index 63e44fd..dbec34e 100644
--- a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
+++ b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
@@ -234,6 +234,7 @@
res = STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION,
msg.string());
} else {
+ Mutex::Autolock idLock(mStreamingRequestIdLock);
mStreamingRequestId = submitInfo->mRequestId;
}
} else {
@@ -271,6 +272,7 @@
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 @@
}
// 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 @@
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 @@
remoteCb->onRepeatingRequestError(lastFrameNumber);
}
- Mutex::Autolock icl(mBinderSerializationLock);
+ Mutex::Autolock idLock(mStreamingRequestIdLock);
mStreamingRequestId = REQUEST_ID_NONE;
}