Merge "Do not allow VmsHalService to close the large packet SharedMemory." into rvc-dev
diff --git a/car-lib/src/android/car/vms/VmsClient.java b/car-lib/src/android/car/vms/VmsClient.java
index 394ba67..a941909 100644
--- a/car-lib/src/android/car/vms/VmsClient.java
+++ b/car-lib/src/android/car/vms/VmsClient.java
@@ -65,6 +65,7 @@
private final Executor mExecutor;
private final VmsClientCallback mCallback;
private final boolean mLegacyClient;
+ private final IVmsClientCallback mClientCallback;
private final Consumer<RemoteException> mExceptionHandler;
private final IBinder mClientToken;
@@ -80,11 +81,13 @@
* @hide
*/
public VmsClient(IVmsBrokerService service, Executor executor, VmsClientCallback callback,
- boolean legacyClient, Consumer<RemoteException> exceptionHandler) {
+ boolean legacyClient, boolean autoCloseMemory,
+ Consumer<RemoteException> exceptionHandler) {
mService = service;
mExecutor = executor;
mCallback = callback;
mLegacyClient = legacyClient;
+ mClientCallback = new IVmsClientCallbackImpl(this, autoCloseMemory);
mExceptionHandler = exceptionHandler;
mClientToken = new Binder();
}
@@ -279,8 +282,8 @@
* @hide
*/
public void register() throws RemoteException {
- VmsRegistrationInfo registrationInfo = mService.registerClient(mClientToken,
- new IVmsClientCallbackImpl(this), mLegacyClient);
+ VmsRegistrationInfo registrationInfo = mService.registerClient(
+ mClientToken, mClientCallback, mLegacyClient);
synchronized (mLock) {
mAvailableLayers = registrationInfo.getAvailableLayers();
mSubscriptionState = registrationInfo.getSubscriptionState();
@@ -298,9 +301,11 @@
private static class IVmsClientCallbackImpl extends IVmsClientCallback.Stub {
private final WeakReference<VmsClient> mClient;
+ private final boolean mAutoCloseMemory;
- private IVmsClientCallbackImpl(VmsClient client) {
+ private IVmsClientCallbackImpl(VmsClient client, boolean autoCloseMemory) {
mClient = new WeakReference<>(client);
+ mAutoCloseMemory = autoCloseMemory;
}
@Override
@@ -337,15 +342,20 @@
@Override
public void onLargePacketReceived(int providerId, VmsLayer layer, SharedMemory packet) {
- try (SharedMemory largePacket = packet) {
- if (DBG) {
- Log.d(TAG, "Received large packet from " + providerId + " for: " + layer
- + " (" + largePacket.getSize() + " bytes)");
- }
- byte[] packetData = sharedMemoryToPacket(largePacket);
- executeCallback((client, callback) ->
- callback.onPacketReceived(providerId, layer, packetData));
+ if (DBG) {
+ Log.d(TAG, "Received large packet from " + providerId + " for: " + layer
+ + " (" + packet.getSize() + " bytes)");
}
+ byte[] largePacket;
+ if (mAutoCloseMemory) {
+ try (SharedMemory autoClosedPacket = packet) {
+ largePacket = sharedMemoryToPacket(autoClosedPacket);
+ }
+ } else {
+ largePacket = sharedMemoryToPacket(packet);
+ }
+ executeCallback((client, callback) ->
+ callback.onPacketReceived(providerId, layer, largePacket));
}
private void executeCallback(BiConsumer<VmsClient, VmsClientCallback> callbackOperation) {
diff --git a/car-lib/src/android/car/vms/VmsClientManager.java b/car-lib/src/android/car/vms/VmsClientManager.java
index c6f8be8..db43342 100644
--- a/car-lib/src/android/car/vms/VmsClientManager.java
+++ b/car-lib/src/android/car/vms/VmsClientManager.java
@@ -127,6 +127,7 @@
}
client = new VmsClient(mBrokerService, executor, callback, legacyClient,
+ /* autoCloseMemory */ true,
this::handleRemoteExceptionFromCarService);
mClients.put(callback, client);
if (DBG) Log.d(TAG, "Client count: " + mClients.size());
diff --git a/service/src/com/android/car/hal/VmsHalService.java b/service/src/com/android/car/hal/VmsHalService.java
index f740f10..f1129f7 100644
--- a/service/src/com/android/car/hal/VmsHalService.java
+++ b/service/src/com/android/car/hal/VmsHalService.java
@@ -347,7 +347,8 @@
return null;
}
VmsClient client = new VmsClient(brokerService, new HandlerExecutor(handler), callback,
- /* legacyClient= */ true, /* exceptionHandler= */ ignored -> { });
+ /* legacyClient= */ true, /* autoCloseMemory */ false,
+ /* exceptionHandler= */ ignored -> { });
try {
client.register();
} catch (RemoteException e) {