diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java b/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java index 43b48546aadaf..4cdc17292ac45 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java @@ -143,8 +143,6 @@ public final class ClientProfile { /** * Called when the client released a frontend. * - *

This could happen when client resource reclaimed. - * * @param frontendId being released. */ public void releaseFrontend(int frontendId) { @@ -167,14 +165,20 @@ public final class ClientProfile { /** * Called when the client released an lnb. * - *

This could happen when client resource reclaimed. - * * @param lnbId being released. */ public void releaseLnb(int lnbId) { mUsingLnbIds.remove(lnbId); } + /** + * Called to reclaim all the resources being used by the current client. + */ + public void reclaimAllResources() { + mUsingFrontendIds.clear(); + mUsingLnbIds.clear(); + } + @Override public String toString() { return "ClientProfile[id=" + this.mId + ", tvInputSessionId=" + this.mTvInputSessionId 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 4374ad0ce5ab1..7231813dd9493 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java @@ -516,10 +516,12 @@ public class TunerResourceManagerService extends SystemService { // When all the resources are occupied, grant the lowest priority resource if the // request client has higher priority. if (inUseLowestPriorityFrId > -1 && (requestClient.getPriority() > currentLowestPriority)) { + if (!reclaimResource(getFrontendResource(inUseLowestPriorityFrId).getOwnerClientId(), + TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) { + return false; + } frontendHandle[0] = generateResourceHandle( TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND, inUseLowestPriorityFrId); - reclaimResource(getFrontendResource(inUseLowestPriorityFrId).getOwnerClientId(), - TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND); updateFrontendClientMappingOnNewGrant(inUseLowestPriorityFrId, request.getClientId()); return true; } @@ -572,10 +574,12 @@ public class TunerResourceManagerService extends SystemService { // request client has higher priority. if (inUseLowestPriorityLnbId > -1 && (requestClient.getPriority() > currentLowestPriority)) { + if (!reclaimResource(getLnbResource(inUseLowestPriorityLnbId).getOwnerClientId(), + TunerResourceManager.TUNER_RESOURCE_TYPE_LNB)) { + return false; + } lnbHandle[0] = generateResourceHandle( TunerResourceManager.TUNER_RESOURCE_TYPE_LNB, inUseLowestPriorityLnbId); - reclaimResource(getLnbResource(inUseLowestPriorityLnbId).getOwnerClientId(), - TunerResourceManager.TUNER_RESOURCE_TYPE_LNB); updateLnbClientMappingOnNewGrant(inUseLowestPriorityLnbId, request.getClientId()); return true; } @@ -668,18 +672,21 @@ public class TunerResourceManagerService extends SystemService { } @VisibleForTesting - protected void reclaimResource(int reclaimingId, + 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(reclaimingId).getListener().onReclaimResources(); + mListeners.get(reclaimingClientId).getListener().onReclaimResources(); } catch (RemoteException e) { - Slog.e(TAG, "Failed to reclaim resources on client " + reclaimingId, e); + Slog.e(TAG, "Failed to reclaim resources on client " + reclaimingClientId, e); + return false; } - // TODO clean all the client and resources mapping/ownership + ClientProfile profile = getClientProfile(reclaimingClientId); + reclaimingResourcesFromClient(profile); + return true; } @VisibleForTesting @@ -833,6 +840,16 @@ public class TunerResourceManagerService extends SystemService { mListeners.remove(clientId); } + private void reclaimingResourcesFromClient(ClientProfile profile) { + for (Integer feId : profile.getInUseFrontendIds()) { + getFrontendResource(feId).removeOwner(); + } + for (Integer lnbId : profile.getInUseLnbIds()) { + getLnbResource(lnbId).removeOwner(); + } + profile.reclaimAllResources(); + } + @VisibleForTesting protected boolean checkClientExists(int clientId) { return mClientProfiles.keySet().contains(clientId); diff --git a/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java index b0f75bb696b18..965304f3c433d 100644 --- a/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java @@ -50,6 +50,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Arrays; +import java.util.HashSet; import java.util.Map; /** @@ -463,6 +464,9 @@ public class TunerResourceManagerServiceTest { } assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0])) .isEqualTo(infos[0].getId()); + assertThat(mTunerResourceManagerService.getClientProfile(clientId0[0]) + .getInUseFrontendIds()).isEqualTo( + new HashSet(Arrays.asList(infos[0].getId(), infos[1].getId()))); request = new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS); @@ -553,7 +557,7 @@ public class TunerResourceManagerServiceTest { .setPriority(clientPriorities[1]); // Init lnb resources. - int[] lnbIds = {0}; + int[] lnbIds = {1}; mTunerResourceManagerService.setLnbInfoListInternal(lnbIds); TunerLnbRequest request = new TunerLnbRequest(clientId0[0]); @@ -566,6 +570,8 @@ public class TunerResourceManagerServiceTest { } assertThat(mTunerResourceManagerService.getResourceIdFromHandle(lnbHandle[0])) .isEqualTo(lnbIds[0]); + assertThat(mTunerResourceManagerService.getClientProfile(clientId0[0]) + .getInUseLnbIds()).isEqualTo(new HashSet(Arrays.asList(lnbIds[0]))); request = new TunerLnbRequest(clientId1[0]); try { @@ -581,6 +587,8 @@ public class TunerResourceManagerServiceTest { assertThat(mTunerResourceManagerService.getLnbResource(lnbIds[0]) .getOwnerClientId()).isEqualTo(clientId1[0]); assertThat(listener.isRelaimed()).isTrue(); + assertThat(mTunerResourceManagerService.getClientProfile(clientId0[0]) + .getInUseLnbIds().size()).isEqualTo(0); } @Test