Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit add074a3 authored by Jan Sebechlebsky's avatar Jan Sebechlebsky
Browse files

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
parent f3475fcf
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -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);
        }
    }

+1 −2
Original line number Diff line number Diff line
@@ -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;
        }
+1 −2
Original line number Diff line number Diff line
@@ -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)
+1 −2
Original line number Diff line number Diff line
@@ -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);