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
+}