Loading services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java +8 −4 Original line number Diff line number Diff line Loading @@ -143,8 +143,6 @@ public final class ClientProfile { /** * Called when the client released a frontend. * * <p>This could happen when client resource reclaimed. * * @param frontendId being released. */ public void releaseFrontend(int frontendId) { Loading @@ -167,14 +165,20 @@ public final class ClientProfile { /** * Called when the client released an lnb. * * <p>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 Loading services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +25 −8 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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; } Loading Loading @@ -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 Loading Loading @@ -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); Loading services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java +9 −1 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Arrays; import java.util.HashSet; import java.util.Map; /** Loading Loading @@ -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<Integer>(Arrays.asList(infos[0].getId(), infos[1].getId()))); request = new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS); Loading Loading @@ -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]); Loading @@ -566,6 +570,8 @@ public class TunerResourceManagerServiceTest { } assertThat(mTunerResourceManagerService.getResourceIdFromHandle(lnbHandle[0])) .isEqualTo(lnbIds[0]); assertThat(mTunerResourceManagerService.getClientProfile(clientId0[0]) .getInUseLnbIds()).isEqualTo(new HashSet<Integer>(Arrays.asList(lnbIds[0]))); request = new TunerLnbRequest(clientId1[0]); try { Loading @@ -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 Loading Loading
services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java +8 −4 Original line number Diff line number Diff line Loading @@ -143,8 +143,6 @@ public final class ClientProfile { /** * Called when the client released a frontend. * * <p>This could happen when client resource reclaimed. * * @param frontendId being released. */ public void releaseFrontend(int frontendId) { Loading @@ -167,14 +165,20 @@ public final class ClientProfile { /** * Called when the client released an lnb. * * <p>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 Loading
services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +25 −8 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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; } Loading Loading @@ -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 Loading Loading @@ -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); Loading
services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java +9 −1 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Arrays; import java.util.HashSet; import java.util.Map; /** Loading Loading @@ -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<Integer>(Arrays.asList(infos[0].getId(), infos[1].getId()))); request = new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS); Loading Loading @@ -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]); Loading @@ -566,6 +570,8 @@ public class TunerResourceManagerServiceTest { } assertThat(mTunerResourceManagerService.getResourceIdFromHandle(lnbHandle[0])) .isEqualTo(lnbIds[0]); assertThat(mTunerResourceManagerService.getClientProfile(clientId0[0]) .getInUseLnbIds()).isEqualTo(new HashSet<Integer>(Arrays.asList(lnbIds[0]))); request = new TunerLnbRequest(clientId1[0]); try { Loading @@ -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 Loading