diff options
| author | 2023-02-27 16:59:15 -0800 | |
|---|---|---|
| committer | 2023-02-27 17:04:51 -0800 | |
| commit | 108485159cb030df4e5f35ea3de940865cf82496 (patch) | |
| tree | 8359d73c7101159cc5290b9ad9c4657cb9eacda4 | |
| parent | f19df858faf9cf841debc95a0c0feb3a7f1b81f0 (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.java | 34 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/AppProfiler.java | 8 |
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) { |