Do not keep the input array with CPU times

CpuTimePerUidFreq puller kept the input array with CPU times to avoid
copies, but that array is owned by the reader and is mutated for each
callback invocation. This corrupted the aggregated data.

Bug: 157535126
Test: cmd stats pull-source 10010
Test: atest CpuStatsTests
Change-Id: Icda6a71f558e582c5d5b497e2cca1d84deed8b99
This commit is contained in:
Rafal Slawik
2021-02-11 10:54:24 +00:00
parent 8b8c4301ac
commit f44fe9c4b6

View File

@@ -1612,9 +1612,6 @@ public class StatsPullAtomService extends SystemService {
// Aggregate times for the same uids.
SparseArray<long[]> aggregated = new SparseArray<>();
mCpuUidFreqTimeReader.readAbsolute((uid, cpuFreqTimeMs) -> {
// For uids known to be aggregated from many entries allow mutating in place to avoid
// many copies. Otherwise, copy before aggregating.
boolean mutateInPlace = false;
if (UserHandle.isIsolated(uid)) {
// Skip individual isolated uids because they are recycled and quickly removed from
// the underlying data source.
@@ -1622,26 +1619,18 @@ public class StatsPullAtomService extends SystemService {
} else if (UserHandle.isSharedAppGid(uid)) {
// All shared app gids are accounted together.
uid = LAST_SHARED_APPLICATION_GID;
mutateInPlace = true;
} else {
// Everything else is accounted under their base uid.
uid = UserHandle.getAppId(uid);
}
long[] aggCpuFreqTimeMs = aggregated.get(uid);
if (aggCpuFreqTimeMs != null) {
if (!mutateInPlace) {
aggCpuFreqTimeMs = Arrays.copyOf(aggCpuFreqTimeMs, cpuFreqTimeMs.length);
aggregated.put(uid, aggCpuFreqTimeMs);
}
for (int freqIndex = 0; freqIndex < cpuFreqTimeMs.length; ++freqIndex) {
aggCpuFreqTimeMs[freqIndex] += cpuFreqTimeMs[freqIndex];
}
} else {
if (mutateInPlace) {
cpuFreqTimeMs = Arrays.copyOf(cpuFreqTimeMs, cpuFreqTimeMs.length);
}
aggregated.put(uid, cpuFreqTimeMs);
if (aggCpuFreqTimeMs == null) {
aggCpuFreqTimeMs = new long[cpuFreqTimeMs.length];
aggregated.put(uid, aggCpuFreqTimeMs);
}
for (int freqIndex = 0; freqIndex < cpuFreqTimeMs.length; ++freqIndex) {
aggCpuFreqTimeMs[freqIndex] += cpuFreqTimeMs[freqIndex];
}
});