Merge "Camera: Use separate lock for status tracker access sync"
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 3958d5b..d4f78e0 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -277,6 +277,7 @@
status_t Camera3Device::disconnect() {
ATRACE_CALL();
Mutex::Autolock il(mInterfaceLock);
+ Mutex::Autolock stLock(mTrackerLock);
ALOGI("%s: E", __FUNCTION__);
@@ -2728,8 +2729,9 @@
if (res < 0) return res;
if (mInFlightMap.size() == 1) {
- // hold mLock to prevent race with disconnect
- Mutex::Autolock l(mLock);
+ // Hold a separate dedicated tracker lock to prevent race with disconnect and also
+ // avoid a deadlock during reprocess requests.
+ Mutex::Autolock l(mTrackerLock);
if (mStatusTracker != nullptr) {
mStatusTracker->markComponentActive(mInFlightStatusId);
}
@@ -2762,8 +2764,9 @@
// Indicate idle inFlightMap to the status tracker
if (mInFlightMap.size() == 0) {
- // hold mLock to prevent race with disconnect
- Mutex::Autolock l(mLock);
+ // Hold a separate dedicated tracker lock to prevent race with disconnect and also
+ // avoid a deadlock during reprocess requests.
+ Mutex::Autolock l(mTrackerLock);
if (mStatusTracker != nullptr) {
mStatusTracker->markComponentIdle(mInFlightStatusId, Fence::NO_FENCE);
}
diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h
index ef3cbc4..96212ab 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.h
+++ b/services/camera/libcameraservice/device3/Camera3Device.h
@@ -1210,6 +1210,9 @@
static callbacks_notify_t sNotify;
+ // Synchronizes access to status tracker between inflight updates and disconnect.
+ // b/79972865
+ Mutex mTrackerLock;
}; // class Camera3Device
}; // namespace android