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