From 8af4d0bbe9d51a697a6d35fe92a6a401c42f4aa4 Mon Sep 17 00:00:00 2001 From: Amy Zhang Date: Tue, 22 Dec 2020 18:49:36 -0800 Subject: [PATCH] Update client pid and priority on requesting resources The previous implementation queried the client process id only once during the client registration. But the pid could change before a client request a resource. We change the impl to update the pid and priority on request. Note that the update only happens when the pid changes compared to the one recorded during client registration or updateClientPriority API call. Test: atest com.android.server.tv.tunerresourcemanager Bug: 176186326 Change-Id: I8d83f7a39d47dc85a00cc4d216080d7eebb66b94 --- .../tunerresourcemanager/ClientProfile.java | 16 ++++++++ .../TunerResourceManagerService.java | 39 +++++++++++++++---- .../TunerResourceManagerServiceTest.java | 10 +++-- 3 files changed, 55 insertions(+), 10 deletions(-) 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 edf007d428c1a..cad8100c88dba 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java @@ -50,6 +50,8 @@ public final class ClientProfile { */ private final int mProcessId; + private boolean mIsForeground; + /** * All the clients that share the same resource would be under the same group id. * @@ -113,6 +115,20 @@ public final class ClientProfile { return mProcessId; } + /** + * Set the current isForeground status. + */ + public void setForeground(boolean isForeground) { + mIsForeground = isForeground; + } + + /** + * Get the previous recorded isForeground status. + */ + public boolean isForeground() { + return mIsForeground; + } + public int getGroupId() { return mGroupId; } 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 ff49ad9bdf6a1..5f885c94fd022 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java @@ -460,7 +460,9 @@ public class TunerResourceManagerService extends SystemService implements IBinde .useCase(profile.useCase) .processId(pid) .build(); - clientProfile.setPriority(getClientPriority(profile.useCase, pid)); + clientProfile.setForeground(checkIsForeground(pid)); + clientProfile.setPriority( + getClientPriority(profile.useCase, clientProfile.isForeground())); addClientProfile(clientId[0], clientProfile, listener); } @@ -498,6 +500,7 @@ public class TunerResourceManagerService extends SystemService implements IBinde return false; } + profile.setForeground(checkIsForeground(profile.getProcessId())); profile.setPriority(priority); profile.setNiceValue(niceValue); @@ -611,6 +614,10 @@ public class TunerResourceManagerService extends SystemService implements IBinde frontendHandle[0] = TunerResourceManager.INVALID_RESOURCE_HANDLE; ClientProfile requestClient = getClientProfile(request.clientId); + if (requestClient == null) { + return false; + } + clientPriorityUpdateOnRequest(requestClient); int grantingFrontendHandle = TunerResourceManager.INVALID_RESOURCE_HANDLE; int inUseLowestPriorityFrHandle = TunerResourceManager.INVALID_RESOURCE_HANDLE; // Priority max value is 1000 @@ -684,6 +691,7 @@ public class TunerResourceManagerService extends SystemService implements IBinde lnbHandle[0] = TunerResourceManager.INVALID_RESOURCE_HANDLE; ClientProfile requestClient = getClientProfile(request.clientId); + clientPriorityUpdateOnRequest(requestClient); int grantingLnbHandle = TunerResourceManager.INVALID_RESOURCE_HANDLE; int inUseLowestPriorityLnbHandle = TunerResourceManager.INVALID_RESOURCE_HANDLE; // Priority max value is 1000 @@ -742,6 +750,7 @@ public class TunerResourceManagerService extends SystemService implements IBinde } casSessionHandle[0] = TunerResourceManager.INVALID_RESOURCE_HANDLE; ClientProfile requestClient = getClientProfile(request.clientId); + clientPriorityUpdateOnRequest(requestClient); int lowestPriorityOwnerId = -1; // Priority max value is 1000 int currentLowestPriority = MAX_CLIENT_PRIORITY + 1; @@ -797,8 +806,9 @@ public class TunerResourceManagerService extends SystemService implements IBinde ? Binder.getCallingPid() /*callingPid*/ : mTvInputManager.getClientPid(holderProfile.tvInputSessionId); /*tvAppId*/ - int challengerPriority = getClientPriority(challengerProfile.useCase, challengerPid); - int holderPriority = getClientPriority(holderProfile.useCase, holderPid); + int challengerPriority = getClientPriority( + challengerProfile.useCase, checkIsForeground(challengerPid)); + int holderPriority = getClientPriority(holderProfile.useCase, checkIsForeground(holderPid)); return challengerPriority > holderPriority; } @@ -842,6 +852,21 @@ public class TunerResourceManagerService extends SystemService implements IBinde return true; } + @VisibleForTesting + // This mothod is to sync up the request client's foreground/background status and update + // the client priority accordingly whenever new resource request comes in. + protected void clientPriorityUpdateOnRequest(ClientProfile requestProfile) { + int pid = requestProfile.getProcessId(); + boolean currentIsForeground = checkIsForeground(pid); + if (requestProfile.isForeground() == currentIsForeground) { + // To avoid overriding the priority set through updateClientPriority API. + return; + } + requestProfile.setForeground(currentIsForeground); + requestProfile.setPriority( + getClientPriority(requestProfile.getUseCase(), currentIsForeground)); + } + @VisibleForTesting protected boolean requestDescramblerInternal( TunerDescramblerRequest request, int[] descramblerHandle) { @@ -933,20 +958,20 @@ public class TunerResourceManagerService extends SystemService implements IBinde } @VisibleForTesting - protected int getClientPriority(int useCase, int pid) { + protected int getClientPriority(int useCase, boolean isForeground) { if (DEBUG) { Slog.d(TAG, "getClientPriority useCase=" + useCase - + ", pid=" + pid + ")"); + + ", isForeground=" + isForeground + ")"); } - if (isForeground(pid)) { + if (isForeground) { return mPriorityCongfig.getForegroundPriority(useCase); } return mPriorityCongfig.getBackgroundPriority(useCase); } @VisibleForTesting - protected boolean isForeground(int pid) { + protected boolean checkIsForeground(int pid) { if (mActivityManager == null) { return false; } 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 83ce9f559a483..e8479a8f2790e 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 @@ -99,7 +99,7 @@ public class TunerResourceManagerServiceTest { when(mContextSpy.getSystemService(Context.TV_INPUT_SERVICE)).thenReturn(tvInputManager); mTunerResourceManagerService = new TunerResourceManagerService(mContextSpy) { @Override - protected boolean isForeground(int pid) { + protected boolean checkIsForeground(int pid) { return mIsForeground; } }; @@ -231,6 +231,10 @@ public class TunerResourceManagerServiceTest { @Test public void requestFrontendTest_ClientNotRegistered() { + TunerFrontendInfo[] infos0 = new TunerFrontendInfo[1]; + infos0[0] = + tunerFrontendInfo(0 /*id*/, FrontendSettings.TYPE_DVBT, 0 /*exclusiveGroupId*/); + mTunerResourceManagerService.setFrontendInfoListInternal(infos0); TunerFrontendRequest request = tunerFrontendRequest(0 /*clientId*/, FrontendSettings.TYPE_DVBT); int[] frontendHandle = new int[1]; @@ -752,9 +756,9 @@ public class TunerResourceManagerServiceTest { resourceClientProfile(null /*sessionId*/, TvInputService.PRIORITY_HINT_USE_CASE_TYPE_RECORD); int backgroundPlaybackPriority = mTunerResourceManagerService.getClientPriority( - TvInputService.PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK, 0); + TvInputService.PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK, mIsForeground); int backgroundRecordPriority = mTunerResourceManagerService.getClientPriority( - TvInputService.PRIORITY_HINT_USE_CASE_TYPE_RECORD, 0); + TvInputService.PRIORITY_HINT_USE_CASE_TYPE_RECORD, mIsForeground); assertThat(mTunerResourceManagerService.isHigherPriorityInternal(backgroundPlaybackProfile, backgroundRecordProfile)).isEqualTo( (backgroundPlaybackPriority > backgroundRecordPriority));