summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java59
-rw-r--r--cmds/statsd/src/external/StatsPullerManager.cpp3
-rw-r--r--services/core/java/com/android/server/stats/pull/StatsPullAtomService.java76
3 files changed, 73 insertions, 65 deletions
diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
index 6c1166a1d594..1a4a2f132936 100644
--- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
+++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
@@ -890,61 +890,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
}
}
- private void pullCpuTimePerThreadFreq(int tagId, long elapsedNanos, long wallClockNanos,
- List<StatsLogEventWrapper> pulledData) {
- if (this.mKernelCpuThreadReader == null) {
- throw new IllegalStateException("mKernelCpuThreadReader is null");
- }
- ArrayList<KernelCpuThreadReader.ProcessCpuUsage> processCpuUsages =
- this.mKernelCpuThreadReader.getProcessCpuUsageDiffed();
- if (processCpuUsages == null) {
- throw new IllegalStateException("processCpuUsages is null");
- }
- int[] cpuFrequencies = mKernelCpuThreadReader.getCpuFrequenciesKhz();
- if (cpuFrequencies.length > CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES) {
- String message = "Expected maximum " + CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES
- + " frequencies, but got " + cpuFrequencies.length;
- Slog.w(TAG, message);
- throw new IllegalStateException(message);
- }
- for (int i = 0; i < processCpuUsages.size(); i++) {
- KernelCpuThreadReader.ProcessCpuUsage processCpuUsage = processCpuUsages.get(i);
- ArrayList<KernelCpuThreadReader.ThreadCpuUsage> threadCpuUsages =
- processCpuUsage.threadCpuUsages;
- for (int j = 0; j < threadCpuUsages.size(); j++) {
- KernelCpuThreadReader.ThreadCpuUsage threadCpuUsage = threadCpuUsages.get(j);
- if (threadCpuUsage.usageTimesMillis.length != cpuFrequencies.length) {
- String message = "Unexpected number of usage times,"
- + " expected " + cpuFrequencies.length
- + " but got " + threadCpuUsage.usageTimesMillis.length;
- Slog.w(TAG, message);
- throw new IllegalStateException(message);
- }
-
- StatsLogEventWrapper e =
- new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos);
- e.writeInt(processCpuUsage.uid);
- e.writeInt(processCpuUsage.processId);
- e.writeInt(threadCpuUsage.threadId);
- e.writeString(processCpuUsage.processName);
- e.writeString(threadCpuUsage.threadName);
- for (int k = 0; k < CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES; k++) {
- if (k < cpuFrequencies.length) {
- e.writeInt(cpuFrequencies[k]);
- e.writeInt(threadCpuUsage.usageTimesMillis[k]);
- } else {
- // If we have no more frequencies to write, we still must write empty data.
- // We know that this data is empty (and not just zero) because all
- // frequencies are expected to be greater than zero
- e.writeInt(0);
- e.writeInt(0);
- }
- }
- pulledData.add(e);
- }
- }
- }
-
private void pullDebugElapsedClock(int tagId,
long elapsedNanos, final long wallClockNanos, List<StatsLogEventWrapper> pulledData) {
final long elapsedMillis = SystemClock.elapsedRealtime();
@@ -1348,10 +1293,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
pullProcessCpuTime(tagId, elapsedNanos, wallClockNanos, ret);
break;
}
- case StatsLog.CPU_TIME_PER_THREAD_FREQ: {
- pullCpuTimePerThreadFreq(tagId, elapsedNanos, wallClockNanos, ret);
- break;
- }
case StatsLog.DEBUG_ELAPSED_CLOCK: {
pullDebugElapsedClock(tagId, elapsedNanos, wallClockNanos, ret);
diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp
index b72de3b9fa39..c62b43564030 100644
--- a/cmds/statsd/src/external/StatsPullerManager.cpp
+++ b/cmds/statsd/src/external/StatsPullerManager.cpp
@@ -113,9 +113,6 @@ std::map<PullerKey, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = {
{{.atomTag = android::util::PROCESS_CPU_TIME},
{.coolDownNs = 5 * NS_PER_SEC /* min cool-down in seconds*/,
.puller = new StatsCompanionServicePuller(android::util::PROCESS_CPU_TIME)}},
- {{.atomTag = android::util::CPU_TIME_PER_THREAD_FREQ},
- {.additiveFields = {7, 9, 11, 13, 15, 17, 19, 21},
- .puller = new StatsCompanionServicePuller(android::util::CPU_TIME_PER_THREAD_FREQ)}},
// DebugElapsedClock.
{{.atomTag = android::util::DEBUG_ELAPSED_CLOCK},
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index 8d45b42f9a87..6aa3021d0fb9 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -227,6 +227,10 @@ public class StatsPullAtomService extends SystemService {
numSpeedSteps);
firstCpuOfCluster += powerProfile.getNumCoresInCpuCluster(i);
}
+
+ // Used for CPU_TIME_PER_THREAD_FREQ
+ mKernelCpuThreadReader =
+ KernelCpuThreadReaderSettingsObserver.getSettingsModifiedReader(mContext);
}
@Override
@@ -1875,12 +1879,78 @@ public class StatsPullAtomService extends SystemService {
// No op.
}
+ @Nullable
+ private KernelCpuThreadReaderDiff mKernelCpuThreadReader;
+ private static final int CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES = 8;
+
private void registerCpuTimePerThreadFreq() {
- // No op.
+ int tagId = StatsLog.CPU_TIME_PER_THREAD_FREQ;
+ PullAtomMetadata metadata = PullAtomMetadata.newBuilder()
+ .setAdditiveFields(new int[] {7, 9, 11, 13, 15, 17, 19, 21})
+ .build();
+ mStatsManager.registerPullAtomCallback(
+ tagId,
+ metadata,
+ (atomTag, data) -> pullCpuTimePerThreadFreq(atomTag, data),
+ BackgroundThread.getExecutor()
+ );
}
- private void pullCpuTimePerThreadFreq() {
- // No op.
+ private int pullCpuTimePerThreadFreq(int atomTag, List<StatsEvent> pulledData) {
+ if (this.mKernelCpuThreadReader == null) {
+ Slog.e(TAG, "mKernelCpuThreadReader is null");
+ return StatsManager.PULL_SKIP;
+ }
+ ArrayList<KernelCpuThreadReader.ProcessCpuUsage> processCpuUsages =
+ this.mKernelCpuThreadReader.getProcessCpuUsageDiffed();
+ if (processCpuUsages == null) {
+ Slog.e(TAG, "processCpuUsages is null");
+ return StatsManager.PULL_SKIP;
+ }
+ int[] cpuFrequencies = mKernelCpuThreadReader.getCpuFrequenciesKhz();
+ if (cpuFrequencies.length > CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES) {
+ String message = "Expected maximum " + CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES
+ + " frequencies, but got " + cpuFrequencies.length;
+ Slog.w(TAG, message);
+ return StatsManager.PULL_SKIP;
+ }
+ for (int i = 0; i < processCpuUsages.size(); i++) {
+ KernelCpuThreadReader.ProcessCpuUsage processCpuUsage = processCpuUsages.get(i);
+ ArrayList<KernelCpuThreadReader.ThreadCpuUsage> threadCpuUsages =
+ processCpuUsage.threadCpuUsages;
+ for (int j = 0; j < threadCpuUsages.size(); j++) {
+ KernelCpuThreadReader.ThreadCpuUsage threadCpuUsage = threadCpuUsages.get(j);
+ if (threadCpuUsage.usageTimesMillis.length != cpuFrequencies.length) {
+ String message = "Unexpected number of usage times,"
+ + " expected " + cpuFrequencies.length
+ + " but got " + threadCpuUsage.usageTimesMillis.length;
+ Slog.w(TAG, message);
+ return StatsManager.PULL_SKIP;
+ }
+
+ StatsEvent.Builder e = StatsEvent.newBuilder();
+ e.setAtomId(atomTag);
+ e.writeInt(processCpuUsage.uid);
+ e.writeInt(processCpuUsage.processId);
+ e.writeInt(threadCpuUsage.threadId);
+ e.writeString(processCpuUsage.processName);
+ e.writeString(threadCpuUsage.threadName);
+ for (int k = 0; k < CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES; k++) {
+ if (k < cpuFrequencies.length) {
+ e.writeInt(cpuFrequencies[k]);
+ e.writeInt(threadCpuUsage.usageTimesMillis[k]);
+ } else {
+ // If we have no more frequencies to write, we still must write empty data.
+ // We know that this data is empty (and not just zero) because all
+ // frequencies are expected to be greater than zero
+ e.writeInt(0);
+ e.writeInt(0);
+ }
+ }
+ pulledData.add(e.build());
+ }
+ }
+ return StatsManager.PULL_SUCCESS;
}
// TODO: move to top of file when all migrations are complete