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
This commit is contained in:
Tim Murray
2023-02-27 16:59:15 -08:00
parent f19df858fa
commit 108485159c
2 changed files with 15 additions and 27 deletions

View File

@@ -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;
}
/**

View File

@@ -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) {