summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tim Murray <timmurray@google.com> 2023-02-27 16:59:15 -0800
committer Tim Murray <timmurray@google.com> 2023-02-27 17:04:51 -0800
commit108485159cb030df4e5f35ea3de940865cf82496 (patch)
tree8359d73c7101159cc5290b9ad9c4657cb9eacda4
parentf19df858faf9cf841debc95a0c0feb3a7f1b81f0 (diff)
AppProfiler: don't hold lock for CPU times
AppProfiler doesn't need to lock when calling getCpuTimeForPid or getCpuDelayTimeForPid. Additionally, ProcessCpuTracker is locking just for the sake of avoiding a long[4] allocation, which might have been necessary in 2009 for dalvik but isn't a concern now. Test: presubmit Bug: 270905745 Change-Id: I585b6113734850ef200fa3faccc1f6decab9389d
-rw-r--r--core/java/com/android/internal/os/ProcessCpuTracker.java34
-rw-r--r--services/core/java/com/android/server/am/AppProfiler.java8
2 files changed, 15 insertions, 27 deletions
diff --git a/core/java/com/android/internal/os/ProcessCpuTracker.java b/core/java/com/android/internal/os/ProcessCpuTracker.java
index 65655b7b5a66..70514c30d90d 100644
--- a/core/java/com/android/internal/os/ProcessCpuTracker.java
+++ b/core/java/com/android/internal/os/ProcessCpuTracker.java
@@ -80,10 +80,6 @@ public class ProcessCpuTracker {
/** Stores user time and system time in jiffies. */
private final long[] mProcessStatsData = new long[4];
- /** Stores user time and system time in jiffies. Used for
- * public API to retrieve CPU use for a process. Must lock while in use. */
- private final long[] mSinglePidStatsData = new long[4];
-
private static final int[] PROCESS_FULL_STATS_FORMAT = new int[] {
PROC_SPACE_TERM,
PROC_SPACE_TERM|PROC_PARENS|PROC_OUT_STRING, // 2: name
@@ -629,17 +625,15 @@ public class ProcessCpuTracker {
* executing in both user and system code. Safe to call without lock held.
*/
public long getCpuTimeForPid(int pid) {
- synchronized (mSinglePidStatsData) {
- final String statFile = "/proc/" + pid + "/stat";
- final long[] statsData = mSinglePidStatsData;
- if (Process.readProcFile(statFile, PROCESS_STATS_FORMAT,
- null, statsData, null)) {
- long time = statsData[PROCESS_STAT_UTIME]
+ final String statFile = "/proc/" + pid + "/stat";
+ final long[] statsData = new long[4];
+ if (Process.readProcFile(statFile, PROCESS_STATS_FORMAT,
+ null, statsData, null)) {
+ long time = statsData[PROCESS_STAT_UTIME]
+ statsData[PROCESS_STAT_STIME];
- return time * mJiffyMillis;
- }
- return 0;
+ return time * mJiffyMillis;
}
+ return 0;
}
/**
@@ -647,15 +641,13 @@ public class ProcessCpuTracker {
* in the runqueue. Safe to call without lock held.
*/
public long getCpuDelayTimeForPid(int pid) {
- synchronized (mSinglePidStatsData) {
- final String statFile = "/proc/" + pid + "/schedstat";
- final long[] statsData = mSinglePidStatsData;
- if (Process.readProcFile(statFile, PROCESS_SCHEDSTATS_FORMAT,
- null, statsData, null)) {
- return statsData[PROCESS_SCHEDSTAT_CPU_DELAY_TIME] / 1_000_000;
- }
- return 0;
+ final String statFile = "/proc/" + pid + "/schedstat";
+ final long[] statsData = new long[4];
+ if (Process.readProcFile(statFile, PROCESS_SCHEDSTATS_FORMAT,
+ null, statsData, null)) {
+ return statsData[PROCESS_SCHEDSTAT_CPU_DELAY_TIME] / 1_000_000;
}
+ return 0;
}
/**
diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java
index 050ac194616f..ac2c725ce80d 100644
--- a/services/core/java/com/android/server/am/AppProfiler.java
+++ b/services/core/java/com/android/server/am/AppProfiler.java
@@ -1892,15 +1892,11 @@ public class AppProfiler {
}
long getCpuTimeForPid(int pid) {
- synchronized (mProcessCpuTracker) {
- return mProcessCpuTracker.getCpuTimeForPid(pid);
- }
+ return mProcessCpuTracker.getCpuTimeForPid(pid);
}
long getCpuDelayTimeForPid(int pid) {
- synchronized (mProcessCpuTracker) {
- return mProcessCpuTracker.getCpuDelayTimeForPid(pid);
- }
+ return mProcessCpuTracker.getCpuDelayTimeForPid(pid);
}
List<ProcessCpuTracker.Stats> getCpuStats(Predicate<ProcessCpuTracker.Stats> predicate) {