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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user