Do not share VirtualDeviceImpl lock with SensorController

There's no reason to share those locks and separating the locks breaks
lock inversion cycle.

Also, return copy of mSensorDescriptors in getSensorDescriptors instead
of original map.

Bug: 278900649
Test: atest CtsVirtualDevicesTestCases
Change-Id: I993ae4f0c2a5590529bcabaa15463956b3aa5b1d
This commit is contained in:
Jan Sebechlebsky
2023-05-08 15:15:28 +02:00
parent f3475fcf11
commit add074a3bd
4 changed files with 7 additions and 11 deletions

View File

@@ -53,19 +53,18 @@ public class SensorController {
private static AtomicInteger sNextDirectChannelHandle = new AtomicInteger(1);
private final Object mLock;
private final Object mLock = new Object();
private final int mVirtualDeviceId;
@GuardedBy("mLock")
private final Map<IBinder, SensorDescriptor> mSensorDescriptors = new ArrayMap<>();
private final ArrayMap<IBinder, SensorDescriptor> mSensorDescriptors = new ArrayMap<>();
@NonNull
private final SensorManagerInternal.RuntimeSensorCallback mRuntimeSensorCallback;
private final SensorManagerInternal mSensorManagerInternal;
private final VirtualDeviceManagerInternal mVdmInternal;
public SensorController(@NonNull Object lock, int virtualDeviceId,
public SensorController(int virtualDeviceId,
@Nullable IVirtualSensorCallback virtualSensorCallback) {
mLock = lock;
mVirtualDeviceId = virtualDeviceId;
mRuntimeSensorCallback = new RuntimeSensorCallbackWrapper(virtualSensorCallback);
mSensorManagerInternal = LocalServices.getService(SensorManagerInternal.class);
@@ -185,7 +184,7 @@ public class SensorController {
@VisibleForTesting
Map<IBinder, SensorDescriptor> getSensorDescriptors() {
synchronized (mLock) {
return mSensorDescriptors;
return new ArrayMap<>(mSensorDescriptors);
}
}

View File

@@ -266,8 +266,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
mInputController = inputController;
}
if (sensorController == null) {
mSensorController = new SensorController(
mVirtualDeviceLock, mDeviceId, mParams.getVirtualSensorCallback());
mSensorController = new SensorController(mDeviceId, mParams.getVirtualSensorCallback());
} else {
mSensorController = sensorController;
}

View File

@@ -70,8 +70,7 @@ public class SensorControllerTest {
LocalServices.removeServiceForTest(SensorManagerInternal.class);
LocalServices.addService(SensorManagerInternal.class, mSensorManagerInternalMock);
mSensorController =
new SensorController(new Object(), VIRTUAL_DEVICE_ID, mVirtualSensorCallback);
mSensorController = new SensorController(VIRTUAL_DEVICE_ID, mVirtualSensorCallback);
mSensorEvent = new VirtualSensorEvent.Builder(new float[] { 1f, 2f, 3f}).build();
mVirtualSensorConfig =
new VirtualSensorConfig.Builder(Sensor.TYPE_ACCELEROMETER, VIRTUAL_SENSOR_NAME)

View File

@@ -359,8 +359,7 @@ public class VirtualDeviceManagerServiceTest {
mInputController = new InputController(mNativeWrapperMock,
new Handler(TestableLooper.get(this).getLooper()),
mContext.getSystemService(WindowManager.class), threadVerifier);
mSensorController =
new SensorController(new Object(), VIRTUAL_DEVICE_ID_1, mVirtualSensorCallback);
mSensorController = new SensorController(VIRTUAL_DEVICE_ID_1, mVirtualSensorCallback);
mCameraAccessController =
new CameraAccessController(mContext, mLocalService, mCameraAccessBlockedCallback);