Fix setVrThread's exception handling.

Bug: 30746129
Change-Id: I49ee29f12b52c9f9f5f061508c5cc8c89fd1cd11
This commit is contained in:
Ruben Brunk
2016-08-09 17:30:13 -07:00
parent 002dd29764
commit 83ea55a9c6

View File

@@ -12566,23 +12566,33 @@ public final class ActivityManagerService extends ActivityManagerNative
synchronized (mPidsSelfLocked) {
final int pid = Binder.getCallingPid();
proc = mPidsSelfLocked.get(pid);
if (proc != null && mInVrMode && tid >= 0) {
// ensure the tid belongs to the process
if (!Process.isThreadInProcess(pid, tid)) {
throw new IllegalArgumentException("VR thread does not belong to process");
}
// reset existing VR thread to CFS
if (proc.vrThreadTid != 0) {
Process.setThreadScheduler(proc.vrThreadTid, Process.SCHED_OTHER, 0);
// reset existing VR thread to CFS if this thread still exists and belongs to
// the calling process
if (proc.vrThreadTid != 0
&& Process.isThreadInProcess(pid, proc.vrThreadTid)) {
try {
Process.setThreadScheduler(proc.vrThreadTid, Process.SCHED_OTHER, 0);
} catch (IllegalArgumentException e) {
// Ignore this. Only occurs in race condition where previous VR thread
// was destroyed during this method call.
}
}
// add check to guarantee that tid belongs to pid?
proc.vrThreadTid = tid;
// promote to FIFO now if the tid is non-zero
if (proc.curSchedGroup == ProcessList.SCHED_GROUP_TOP_APP && proc.vrThreadTid > 0) {
Process.setThreadScheduler(proc.vrThreadTid, Process.SCHED_FIFO | Process.SCHED_RESET_ON_FORK, 1);
if (proc.curSchedGroup == ProcessList.SCHED_GROUP_TOP_APP
&& proc.vrThreadTid > 0) {
Process.setThreadScheduler(proc.vrThreadTid,
Process.SCHED_FIFO | Process.SCHED_RESET_ON_FORK, 1);
}
} else {
//Slog.e("VR_FIFO", "Didn't set thread from setVrThread?");
}
}
}