Camera: fix deadlock
Do not hold request lock while executing client callback.
Bug: 28821274
Change-Id: Ibbdae7f892a54abd0b6d87d2295e9863983e1cf7
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 0e4e244..c0de95a 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -2967,19 +2967,28 @@
}
void Camera3Device::RequestThread::checkAndStopRepeatingRequest() {
- Mutex::Autolock l(mRequestLock);
- // Check all streams needed by repeating requests are still valid. Otherwise, stop
- // repeating requests.
- for (const auto& request : mRepeatingRequests) {
- for (const auto& s : request->mOutputStreams) {
- if (s->isAbandoned()) {
- int64_t lastFrameNumber = 0;
- clearRepeatingRequestsLocked(&lastFrameNumber);
- mListener->notifyRepeatingRequestError(lastFrameNumber);
- return;
+ bool surfaceAbandoned = false;
+ int64_t lastFrameNumber = 0;
+ {
+ Mutex::Autolock l(mRequestLock);
+ // Check all streams needed by repeating requests are still valid. Otherwise, stop
+ // repeating requests.
+ for (const auto& request : mRepeatingRequests) {
+ for (const auto& s : request->mOutputStreams) {
+ if (s->isAbandoned()) {
+ surfaceAbandoned = true;
+ clearRepeatingRequestsLocked(&lastFrameNumber);
+ break;
+ }
+ }
+ if (surfaceAbandoned) {
+ break;
}
}
}
+ if (surfaceAbandoned) {
+ mListener->notifyRepeatingRequestError(lastFrameNumber);
+ }
}
bool Camera3Device::RequestThread::threadLoop() {