From cc7c8d64341fb62d3dbd1330109bceb742570d29 Mon Sep 17 00:00:00 2001 From: Kensuke Miyagi Date: Wed, 25 Aug 2021 00:37:26 -0700 Subject: [PATCH] Make Tuner resource reclaiming synchronous Also in onReclaimResource sequence, handle the reclaim the sharee before reclaiming the originally requested client Bug: 197332718 Test: android.media.tv.tuner.cts.TunerTest#testResourceReclaimed and testResourceReclaimedDifferentThread Change-Id: Ia4325bf7360a761cf8c6218987e1d62f99096c30 --- media/java/android/media/tv/tuner/Tuner.java | 3 +- .../IResourcesReclaimListener.aidl | 4 +- .../TunerResourceManagerService.java | 42 ++++++++++++------- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index ed5e6eeca34f3..06d907922365e 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -53,7 +53,6 @@ import android.media.tv.tunerresourcemanager.TunerFrontendRequest; import android.media.tv.tunerresourcemanager.TunerLnbRequest; import android.media.tv.tunerresourcemanager.TunerResourceManager; import android.os.Handler; -import android.os.HandlerExecutor; import android.os.Looper; import android.os.Message; import android.os.Process; @@ -354,7 +353,7 @@ public class Tuner implements AutoCloseable { profile.tvInputSessionId = tvInputSessionId; profile.useCase = useCase; mTunerResourceManager.registerClientProfile( - profile, new HandlerExecutor(mHandler), mResourceListener, clientId); + profile, Runnable::run, mResourceListener, clientId); mClientId = clientId[0]; mUserId = Process.myUid(); diff --git a/media/java/android/media/tv/tunerresourcemanager/aidl/android/media/tv/tunerresourcemanager/IResourcesReclaimListener.aidl b/media/java/android/media/tv/tunerresourcemanager/aidl/android/media/tv/tunerresourcemanager/IResourcesReclaimListener.aidl index 1a4eb2946b8cb..feb68dc32138b 100644 --- a/media/java/android/media/tv/tunerresourcemanager/aidl/android/media/tv/tunerresourcemanager/IResourcesReclaimListener.aidl +++ b/media/java/android/media/tv/tunerresourcemanager/aidl/android/media/tv/tunerresourcemanager/IResourcesReclaimListener.aidl @@ -21,7 +21,7 @@ package android.media.tv.tunerresourcemanager; * * @hide */ -oneway interface IResourcesReclaimListener { +interface IResourcesReclaimListener { /* * TRM invokes this method when the client's resources need to be reclaimed. * @@ -30,4 +30,4 @@ oneway interface IResourcesReclaimListener { * then grant the resource. */ void onReclaimResources(); -} \ No newline at end of file +} diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java index 22f0adaee4cff..8fb81fa89db99 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java @@ -922,8 +922,10 @@ public class TunerResourceManagerService extends SystemService implements IBinde } if (clientId == fe.getOwnerClientId()) { ClientProfile ownerClient = getClientProfile(fe.getOwnerClientId()); - for (int shareOwnerId : ownerClient.getShareFeClientIds()) { - clearFrontendAndClientMapping(getClientProfile(shareOwnerId)); + if (ownerClient != null) { + for (int shareOwnerId : ownerClient.getShareFeClientIds()) { + clearFrontendAndClientMapping(getClientProfile(shareOwnerId)); + } } } clearFrontendAndClientMapping(getClientProfile(clientId)); @@ -1039,20 +1041,13 @@ public class TunerResourceManagerService extends SystemService implements IBinde @VisibleForTesting protected boolean reclaimResource(int reclaimingClientId, @TunerResourceManager.TunerResourceType int resourceType) { - if (DEBUG) { - Slog.d(TAG, "Reclaiming resources because higher priority client request resource type " - + resourceType); - } - try { - mListeners.get(reclaimingClientId).getListener().onReclaimResources(); - } catch (RemoteException e) { - Slog.e(TAG, "Failed to reclaim resources on client " + reclaimingClientId, e); - return false; - } // Reclaim all the resources of the share owners of the frontend that is used by the current // resource reclaimed client. ClientProfile profile = getClientProfile(reclaimingClientId); + if (profile == null) { + return true; + } Set shareFeClientIds = profile.getShareFeClientIds(); for (int clientId : shareFeClientIds) { try { @@ -1063,6 +1058,17 @@ public class TunerResourceManagerService extends SystemService implements IBinde } clearAllResourcesAndClientMapping(getClientProfile(clientId)); } + + if (DEBUG) { + Slog.d(TAG, "Reclaiming resources because higher priority client request resource type " + + resourceType + ", clientId:" + reclaimingClientId); + } + try { + mListeners.get(reclaimingClientId).getListener().onReclaimResources(); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to reclaim resources on client " + reclaimingClientId, e); + return false; + } clearAllResourcesAndClientMapping(profile); return true; } @@ -1319,13 +1325,21 @@ public class TunerResourceManagerService extends SystemService implements IBinde } private void clearFrontendAndClientMapping(ClientProfile profile) { + if (profile == null) { + return; + } for (Integer feId : profile.getInUseFrontendHandles()) { FrontendResource fe = getFrontendResource(feId); - if (fe.getOwnerClientId() == profile.getId()) { + int ownerClientId = fe.getOwnerClientId(); + if (ownerClientId == profile.getId()) { fe.removeOwner(); continue; } - getClientProfile(fe.getOwnerClientId()).stopSharingFrontend(profile.getId()); + ClientProfile ownerClientProfile = getClientProfile(ownerClientId); + if (ownerClientProfile != null) { + ownerClientProfile.stopSharingFrontend(profile.getId()); + } + } profile.releaseFrontend(); }