Merge "Complete the resource reclaim implementation in TRM" into rvc-dev

This commit is contained in:
Amy Zhang
2020-04-17 03:31:59 +00:00
committed by Android (Google) Code Review
3 changed files with 42 additions and 13 deletions

View File

@@ -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) {
@@ -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

View File

@@ -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);

View File

@@ -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<Integer>(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<Integer>(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