summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Shuzhen Wang <shuzhenwang@google.com> 2024-09-19 14:23:20 -0700
committer Shuzhen Wang <shuzhenwang@google.com> 2024-09-19 14:37:29 -0700
commitaf274a1b252752b385bceb14f1f88e361e2c91e5 (patch)
tree981a02bd5fd34e17f3143db3055bdb1879609611
parent5268d622137059a6c0daca8a54a6481a5394a69a (diff)
Camera: Fix race condition in CameraManager
cameraIdHasConcurrentStreamsLocked needs to hold CameraManagerGlobal.mLock. Holding CameraManager.mLock isn't sufficient. Flag: EXEMPT bugfix Test: CameraManagerTest Bug: 368402060 Change-Id: Iee92c5d8d7ea68447d6730f0cc34632171c6b689
-rw-r--r--core/java/android/hardware/camera2/CameraManager.java32
1 files changed, 17 insertions, 15 deletions
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index d40b2e342fbb..21627920f598 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -818,7 +818,7 @@ public final class CameraManager {
}
boolean hasConcurrentStreams =
- CameraManagerGlobal.get().cameraIdHasConcurrentStreamsLocked(cameraId,
+ CameraManagerGlobal.get().cameraIdHasConcurrentStreams(cameraId,
mContext.getDeviceId(), getDevicePolicyFromContext(mContext));
metadata.setHasMandatoryConcurrentStreams(hasConcurrentStreams);
@@ -2629,24 +2629,26 @@ public final class CameraManager {
* @return Whether the camera device was found in the set of combinations returned by
* getConcurrentCameraIds
*/
- public boolean cameraIdHasConcurrentStreamsLocked(String cameraId, int deviceId,
+ public boolean cameraIdHasConcurrentStreams(String cameraId, int deviceId,
int devicePolicy) {
- DeviceCameraInfo info = new DeviceCameraInfo(cameraId,
- devicePolicy == DEVICE_POLICY_DEFAULT ? DEVICE_ID_DEFAULT : deviceId);
- if (!mDeviceStatus.containsKey(info)) {
- // physical camera ids aren't advertised in concurrent camera id combinations.
- if (DEBUG) {
- Log.v(TAG, " physical camera id " + cameraId + " is hidden." +
- " Available logical camera ids : " + mDeviceStatus);
+ synchronized (mLock) {
+ DeviceCameraInfo info = new DeviceCameraInfo(cameraId,
+ devicePolicy == DEVICE_POLICY_DEFAULT ? DEVICE_ID_DEFAULT : deviceId);
+ if (!mDeviceStatus.containsKey(info)) {
+ // physical camera ids aren't advertised in concurrent camera id combinations.
+ if (DEBUG) {
+ Log.v(TAG, " physical camera id " + cameraId + " is hidden."
+ + " Available logical camera ids : " + mDeviceStatus);
+ }
+ return false;
}
- return false;
- }
- for (Set<DeviceCameraInfo> comb : mConcurrentCameraIdCombinations) {
- if (comb.contains(info)) {
- return true;
+ for (Set<DeviceCameraInfo> comb : mConcurrentCameraIdCombinations) {
+ if (comb.contains(info)) {
+ return true;
+ }
}
+ return false;
}
- return false;
}
public void setTorchMode(