Reduce system calls of ThreadPriorityBooster

- ThreadLocal is bound to each thread, so we don't need to
  get tid every time.
- By storing whether the priority is changed, we don't need
  to get thread priority to decide whether to restore.

The cost of a simple boost region is reduced over 20%.

Test: atest ThreadPriorityBoosterTest
Bug: 123043091
Change-Id: I634898c1bf0d10de4f53fd18043f64d18fe9082b
diff --git a/services/core/java/com/android/server/ThreadPriorityBooster.java b/services/core/java/com/android/server/ThreadPriorityBooster.java
index f74a4385..dab6bc4 100644
--- a/services/core/java/com/android/server/ThreadPriorityBooster.java
+++ b/services/core/java/com/android/server/ThreadPriorityBooster.java
@@ -26,6 +26,7 @@
 public class ThreadPriorityBooster {
 
     private static final boolean ENABLE_LOCK_GUARD = false;
+    private static final int PRIORITY_NOT_ADJUSTED = Integer.MAX_VALUE;
 
     private volatile int mBoostToPriority;
     private final int mLockGuardIndex;
@@ -42,13 +43,12 @@
     }
 
     public void boost() {
-        final int tid = myTid();
         final PriorityState state = mThreadState.get();
         if (state.regionCounter == 0) {
-            final int prevPriority = getThreadPriority(tid);
-            state.prevPriority = prevPriority;
+            final int prevPriority = getThreadPriority(state.tid);
             if (prevPriority > mBoostToPriority) {
-                setThreadPriority(tid, mBoostToPriority);
+                setThreadPriority(state.tid, mBoostToPriority);
+                state.prevPriority = prevPriority;
             }
         }
         state.regionCounter++;
@@ -60,11 +60,9 @@
     public void reset() {
         final PriorityState state = mThreadState.get();
         state.regionCounter--;
-        if (state.regionCounter == 0) {
-            final int currentPriority = getThreadPriority(myTid());
-            if (state.prevPriority != currentPriority) {
-                setThreadPriority(myTid(), state.prevPriority);
-            }
+        if (state.regionCounter == 0 && state.prevPriority != PRIORITY_NOT_ADJUSTED) {
+            setThreadPriority(state.tid, state.prevPriority);
+            state.prevPriority = PRIORITY_NOT_ADJUSTED;
         }
     }
 
@@ -78,16 +76,16 @@
         // variable immediately.
         mBoostToPriority = priority;
         final PriorityState state = mThreadState.get();
-        final int tid = myTid();
         if (state.regionCounter != 0) {
-            final int prevPriority = getThreadPriority(tid);
+            final int prevPriority = getThreadPriority(state.tid);
             if (prevPriority != priority) {
-                setThreadPriority(tid, priority);
+                setThreadPriority(state.tid, priority);
             }
         }
     }
 
     private static class PriorityState {
+        final int tid = myTid();
 
         /**
          * Acts as counter for number of synchronized region that needs to acquire 'this' as a lock
@@ -99,6 +97,6 @@
         /**
          * The thread's previous priority before boosting.
          */
-        int prevPriority;
+        int prevPriority = PRIORITY_NOT_ADJUSTED;
     }
-}
\ No newline at end of file
+}