Fix setVrThread's exception handling.

Bug: 30746129
Change-Id: I49ee29f12b52c9f9f5f061508c5cc8c89fd1cd11
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index e336ed5..ee15cc8 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -12566,23 +12566,33 @@
             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?");
                 }
             }
         }