1c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz/*
2c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz * Copyright (C) 2017 The Android Open Source Project
3c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz *
4c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz * Licensed under the Apache License, Version 2.0 (the "License");
5c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz * you may not use this file except in compliance with the License.
6c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz * You may obtain a copy of the License at
7c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz *
8c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz *      http://www.apache.org/licenses/LICENSE-2.0
9c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz *
10c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz * Unless required by applicable law or agreed to in writing, software
11c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz * distributed under the License is distributed on an "AS IS" BASIS,
12c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz * See the License for the specific language governing permissions and
14c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz * limitations under the License.
15c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz */
16c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz
1780f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yu#define DEBUG false
189fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato#include "Log.h"
19c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz
20c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz#include <android/os/IStatsCompanionService.h>
21b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu#include <cutils/log.h>
221a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu#include <math.h>
233b3adcd8b617803e276b793112f55494a84a89dfChenjie Yu#include <stdint.h>
24b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu#include <algorithm>
251a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu#include "../StatsService.h"
26aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu#include "../logd/LogEvent.h"
27aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu#include "../stats_log_util.h"
28aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu#include "../statscompanion_util.h"
294029831e36ef1e4a017bf55e1ec8f8b64849c5a3Tej Singh#include "ResourceHealthManagerPuller.h"
304029831e36ef1e4a017bf55e1ec8f8b64849c5a3Tej Singh#include "ResourceThermalManagerPuller.h"
315305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu#include "StatsCompanionServicePuller.h"
321a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu#include "StatsPullerManagerImpl.h"
33bf972d99a9ee383b984137c49ad45a17df0c73d2Tej Singh#include "SubsystemSleepStatePuller.h"
345305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu#include "statslog.h"
351481fe142d36d5f0b36eeebc358d5a8aef7bf28aDavid Chen
361481fe142d36d5f0b36eeebc358d5a8aef7bf28aDavid Chen#include <iostream>
37c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz
3893fe3a34a02c673eaee4a2d18565ba8df20685cbYao Chenusing std::make_shared;
395305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yuusing std::map;
4093fe3a34a02c673eaee4a2d18565ba8df20685cbYao Chenusing std::shared_ptr;
41b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yuusing std::string;
42b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yuusing std::vector;
436736c893a73c567d3794d88ae0d17abab34b7a6fChenjie Yuusing std::list;
44c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz
45c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatznamespace android {
46c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatznamespace os {
47c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatznamespace statsd {
48c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz
493b3adcd8b617803e276b793112f55494a84a89dfChenjie Yu// Values smaller than this may require to update the alarm.
503b3adcd8b617803e276b793112f55494a84a89dfChenjie Yuconst int64_t NO_ALARM_UPDATE = INT64_MAX;
513b3adcd8b617803e276b793112f55494a84a89dfChenjie Yu
5280f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yuconst std::map<int, PullAtomInfo> StatsPullerManagerImpl::kAllPullAtomInfo = {
53feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // wifi_bytes_transfer
54feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        {android::util::WIFI_BYTES_TRANSFER,
551a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{2, 3, 4, 5},
561a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {},
571a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
58feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu          new StatsCompanionServicePuller(android::util::WIFI_BYTES_TRANSFER)}},
59feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // wifi_bytes_transfer_by_fg_bg
60feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        {android::util::WIFI_BYTES_TRANSFER_BY_FG_BG,
611a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{3, 4, 5, 6},
621a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {2},
631a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
64feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu          new StatsCompanionServicePuller(android::util::WIFI_BYTES_TRANSFER_BY_FG_BG)}},
65feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // mobile_bytes_transfer
66feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        {android::util::MOBILE_BYTES_TRANSFER,
671a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{2, 3, 4, 5},
681a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {},
691a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
70feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu          new StatsCompanionServicePuller(android::util::MOBILE_BYTES_TRANSFER)}},
71feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // mobile_bytes_transfer_by_fg_bg
72feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        {android::util::MOBILE_BYTES_TRANSFER_BY_FG_BG,
731a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{3, 4, 5, 6},
741a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {2},
751a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
76feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu          new StatsCompanionServicePuller(android::util::MOBILE_BYTES_TRANSFER_BY_FG_BG)}},
77feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // bluetooth_bytes_transfer
78feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        {android::util::BLUETOOTH_BYTES_TRANSFER,
791a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{2, 3},
801a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {},
811a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
821a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          new StatsCompanionServicePuller(android::util::BLUETOOTH_BYTES_TRANSFER)}},
83feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // kernel_wakelock
84feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        {android::util::KERNEL_WAKELOCK,
851a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{}, {}, 1 * NS_PER_SEC, new StatsCompanionServicePuller(android::util::KERNEL_WAKELOCK)}},
86feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // subsystem_sleep_state
87ec67661bdfe1814039f625575176678219acc7b1Chenjie Yu        {android::util::SUBSYSTEM_SLEEP_STATE,
881a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{}, {}, 1 * NS_PER_SEC, new SubsystemSleepStatePuller()}},
89feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // cpu_time_per_freq
90feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        {android::util::CPU_TIME_PER_FREQ,
911a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{3},
921a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {2},
931a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
941a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          new StatsCompanionServicePuller(android::util::CPU_TIME_PER_FREQ)}},
95feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // cpu_time_per_uid
96ec67661bdfe1814039f625575176678219acc7b1Chenjie Yu        {android::util::CPU_TIME_PER_UID,
971a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{2, 3},
981a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {},
991a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
1001a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          new StatsCompanionServicePuller(android::util::CPU_TIME_PER_UID)}},
101feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // cpu_time_per_uid_freq
1021a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        // the throttling is 3sec, handled in
1031a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
104ec67661bdfe1814039f625575176678219acc7b1Chenjie Yu        {android::util::CPU_TIME_PER_UID_FREQ,
1051a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{4},
1061a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {2, 3},
1071a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
1081a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          new StatsCompanionServicePuller(android::util::CPU_TIME_PER_UID_FREQ)}},
109ec67661bdfe1814039f625575176678219acc7b1Chenjie Yu        // cpu_active_time
1101a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        // the throttling is 3sec, handled in
1111a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
112ec67661bdfe1814039f625575176678219acc7b1Chenjie Yu        {android::util::CPU_ACTIVE_TIME,
1131a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{2},
1141a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {},
1151a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
1161a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          new StatsCompanionServicePuller(android::util::CPU_ACTIVE_TIME)}},
117ec67661bdfe1814039f625575176678219acc7b1Chenjie Yu        // cpu_cluster_time
1181a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        // the throttling is 3sec, handled in
1191a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
120ec67661bdfe1814039f625575176678219acc7b1Chenjie Yu        {android::util::CPU_CLUSTER_TIME,
1211a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{3},
1221a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {2},
1231a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
1241a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          new StatsCompanionServicePuller(android::util::CPU_CLUSTER_TIME)}},
125feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // wifi_activity_energy_info
1265caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu        {android::util::WIFI_ACTIVITY_INFO,
1271a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{},
1281a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {},
1291a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
1305caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu          new StatsCompanionServicePuller(android::util::WIFI_ACTIVITY_INFO)}},
131feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // modem_activity_info
132feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        {android::util::MODEM_ACTIVITY_INFO,
1331a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{},
1341a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {},
1351a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
1361a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          new StatsCompanionServicePuller(android::util::MODEM_ACTIVITY_INFO)}},
137feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // bluetooth_activity_info
138feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        {android::util::BLUETOOTH_ACTIVITY_INFO,
1391a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{},
1401a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {},
1411a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
1421a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          new StatsCompanionServicePuller(android::util::BLUETOOTH_ACTIVITY_INFO)}},
143feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // system_elapsed_realtime
144feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        {android::util::SYSTEM_ELAPSED_REALTIME,
1451a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{},
1461a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {},
1471a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
1481a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          new StatsCompanionServicePuller(android::util::SYSTEM_ELAPSED_REALTIME)}},
149feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // system_uptime
150feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        {android::util::SYSTEM_UPTIME,
1511a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{}, {}, 1 * NS_PER_SEC, new StatsCompanionServicePuller(android::util::SYSTEM_UPTIME)}},
152feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // disk_space
153feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        {android::util::DISK_SPACE,
1541a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{}, {}, 1 * NS_PER_SEC, new StatsCompanionServicePuller(android::util::DISK_SPACE)}},
155feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // remaining_battery_capacity
156feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        {android::util::REMAINING_BATTERY_CAPACITY,
1571a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{},
1581a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {},
1591a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
1601a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          new ResourceHealthManagerPuller(android::util::REMAINING_BATTERY_CAPACITY)}},
161feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        // full_battery_capacity
162feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu        {android::util::FULL_BATTERY_CAPACITY,
1631a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{},
1641a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {},
1651a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
1661a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          new ResourceHealthManagerPuller(android::util::FULL_BATTERY_CAPACITY)}},
16722d92b76bccd6666ea34009310dced62ba79165bRajeev Kumar        // process_memory_state
16822d92b76bccd6666ea34009310dced62ba79165bRajeev Kumar        {android::util::PROCESS_MEMORY_STATE,
1691a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu         {{4, 5, 6, 7, 8},
1701a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          {2, 3},
1711a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu          1 * NS_PER_SEC,
172ec67661bdfe1814039f625575176678219acc7b1Chenjie Yu          new StatsCompanionServicePuller(android::util::PROCESS_MEMORY_STATE)}},
1734029831e36ef1e4a017bf55e1ec8f8b64849c5a3Tej Singh        // temperature
1744029831e36ef1e4a017bf55e1ec8f8b64849c5a3Tej Singh        {android::util::TEMPERATURE, {{}, {}, 1, new ResourceThermalManagerPuller()}}};
17580f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yu
1763b3adcd8b617803e276b793112f55494a84a89dfChenjie YuStatsPullerManagerImpl::StatsPullerManagerImpl() : mNextPullTimeNs(NO_ALARM_UPDATE) {
1771a317baedaa79f015ad637353c81abb337890733Chenjie Yu}
1781a317baedaa79f015ad637353c81abb337890733Chenjie Yu
1791a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yubool StatsPullerManagerImpl::Pull(const int tagId, const int64_t timeNs,
1801a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu                                  vector<shared_ptr<LogEvent>>* data) {
181484524a246ffe453f8cd89b698a279c23b0bde1fTej Singh    VLOG("Initiating pulling %d", tagId);
182c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz
18380f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yu    if (kAllPullAtomInfo.find(tagId) != kAllPullAtomInfo.end()) {
1841a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        bool ret = kAllPullAtomInfo.find(tagId)->second.puller->Pull(timeNs, data);
185484524a246ffe453f8cd89b698a279c23b0bde1fTej Singh        VLOG("pulled %d items", (int)data->size());
186484524a246ffe453f8cd89b698a279c23b0bde1fTej Singh        return ret;
18793fe3a34a02c673eaee4a2d18565ba8df20685cbYao Chen    } else {
188484524a246ffe453f8cd89b698a279c23b0bde1fTej Singh        VLOG("Unknown tagId %d", tagId);
18993fe3a34a02c673eaee4a2d18565ba8df20685cbYao Chen        return false;  // Return early since we don't know what to pull.
19093fe3a34a02c673eaee4a2d18565ba8df20685cbYao Chen    }
19193fe3a34a02c673eaee4a2d18565ba8df20685cbYao Chen}
192b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu
1936736c893a73c567d3794d88ae0d17abab34b7a6fChenjie YuStatsPullerManagerImpl& StatsPullerManagerImpl::GetInstance() {
1946736c893a73c567d3794d88ae0d17abab34b7a6fChenjie Yu    static StatsPullerManagerImpl instance;
195b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    return instance;
196b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu}
197b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu
1987c334a129e93e405a72e8299a1cd928af079d14fYangsterbool StatsPullerManagerImpl::PullerForMatcherExists(int tagId) const {
199feba309244ce3d499e8ffe6132ac0c9eca5fc434Chenjie Yu    return kAllPullAtomInfo.find(tagId) != kAllPullAtomInfo.end();
200b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu}
201b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu
202aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yuvoid StatsPullerManagerImpl::updateAlarmLocked() {
2033b3adcd8b617803e276b793112f55494a84a89dfChenjie Yu    if (mNextPullTimeNs == NO_ALARM_UPDATE) {
2041a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        VLOG("No need to set alarms. Skipping");
2051a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        return;
2061a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu    }
2071a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu
208aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    sp<IStatsCompanionService> statsCompanionServiceCopy = mStatsCompanionService;
209aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    if (statsCompanionServiceCopy != nullptr) {
2101a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        statsCompanionServiceCopy->setPullingAlarm(mNextPullTimeNs / 1000000);
211aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    } else {
212aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu        VLOG("StatsCompanionService not available. Alarm not set.");
213aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    }
214aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    return;
215aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu}
216aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu
217aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yuvoid StatsPullerManagerImpl::SetStatsCompanionService(
218aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu        sp<IStatsCompanionService> statsCompanionService) {
219aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    AutoMutex _l(mLock);
220aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    sp<IStatsCompanionService> tmpForLock = mStatsCompanionService;
221aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    mStatsCompanionService = statsCompanionService;
222aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    for (const auto& pulledAtom : kAllPullAtomInfo) {
223aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu        pulledAtom.second.puller->SetStatsCompanionService(statsCompanionService);
224aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    }
225aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    if (mStatsCompanionService != nullptr) {
226aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu        updateAlarmLocked();
227aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    }
228aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu}
229aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu
2306736c893a73c567d3794d88ae0d17abab34b7a6fChenjie Yuvoid StatsPullerManagerImpl::RegisterReceiver(int tagId, wp<PullDataReceiver> receiver,
2311a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu                                              int64_t nextPullTimeNs, int64_t intervalNs) {
232aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    AutoMutex _l(mLock);
2336736c893a73c567d3794d88ae0d17abab34b7a6fChenjie Yu    auto& receivers = mReceivers[tagId];
234b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    for (auto it = receivers.begin(); it != receivers.end(); it++) {
2356736c893a73c567d3794d88ae0d17abab34b7a6fChenjie Yu        if (it->receiver == receiver) {
236b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu            VLOG("Receiver already registered of %d", (int)receivers.size());
237b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu            return;
238b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu        }
239b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    }
240b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    ReceiverInfo receiverInfo;
241b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    receiverInfo.receiver = receiver;
242b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu
24385ed8387135849f256cecb4429c75938ad91cd55Chenjie Yu    // Round it to the nearest minutes. This is the limit of alarm manager.
2441a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu    // In practice, we should always have larger buckets.
2451a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu    int64_t roundedIntervalNs = intervalNs / NS_PER_SEC / 60 * NS_PER_SEC * 60;
24683baaa1212af188db7db547a0a91560d161437a4Chenjie Yu    // Scheduled pulling should be at least 1 min apart.
24783baaa1212af188db7db547a0a91560d161437a4Chenjie Yu    // This can be lower in cts tests, in which case we round it to 1 min.
2481a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu    if (roundedIntervalNs < 60 * (int64_t)NS_PER_SEC) {
2491a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        roundedIntervalNs = 60 * (int64_t)NS_PER_SEC;
25083baaa1212af188db7db547a0a91560d161437a4Chenjie Yu    }
2511a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu
2521a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu    receiverInfo.intervalNs = roundedIntervalNs;
2531a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu    receiverInfo.nextPullTimeNs = nextPullTimeNs;
2541a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu    receivers.push_back(receiverInfo);
2551a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu
256b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    // There is only one alarm for all pulled events. So only set it to the smallest denom.
2571a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu    if (nextPullTimeNs < mNextPullTimeNs) {
2581a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        VLOG("Updating next pull time %lld", (long long)mNextPullTimeNs);
2591a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        mNextPullTimeNs = nextPullTimeNs;
260aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu        updateAlarmLocked();
261b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    }
2625305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu    VLOG("Puller for tagId %d registered of %d", tagId, (int)receivers.size());
263b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu}
264b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu
2656736c893a73c567d3794d88ae0d17abab34b7a6fChenjie Yuvoid StatsPullerManagerImpl::UnRegisterReceiver(int tagId, wp<PullDataReceiver> receiver) {
266aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    AutoMutex _l(mLock);
2675305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu    if (mReceivers.find(tagId) == mReceivers.end()) {
2685305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu        VLOG("Unknown pull code or no receivers: %d", tagId);
269b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu        return;
270b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    }
2715305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu    auto& receivers = mReceivers.find(tagId)->second;
272b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    for (auto it = receivers.begin(); it != receivers.end(); it++) {
2736736c893a73c567d3794d88ae0d17abab34b7a6fChenjie Yu        if (receiver == it->receiver) {
274b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu            receivers.erase(it);
2755305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu            VLOG("Puller for tagId %d unregistered of %d", tagId, (int)receivers.size());
276b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu            return;
277b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu        }
278b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    }
279b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu}
280b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu
28115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-macvoid StatsPullerManagerImpl::OnAlarmFired(const int64_t currentTimeNs) {
282aa5b2010152c4042786b558a44a89d25229d8962Chenjie Yu    AutoMutex _l(mLock);
283b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu
2843b3adcd8b617803e276b793112f55494a84a89dfChenjie Yu    int64_t minNextPullTimeNs = NO_ALARM_UPDATE;
285b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu
286b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    vector<pair<int, vector<ReceiverInfo*>>> needToPull =
287b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu            vector<pair<int, vector<ReceiverInfo*>>>();
288b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    for (auto& pair : mReceivers) {
289b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu        vector<ReceiverInfo*> receivers = vector<ReceiverInfo*>();
29093fe3a34a02c673eaee4a2d18565ba8df20685cbYao Chen        if (pair.second.size() != 0) {
2911a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu            for (ReceiverInfo& receiverInfo : pair.second) {
29215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                if (receiverInfo.nextPullTimeNs <= currentTimeNs) {
293b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu                    receivers.push_back(&receiverInfo);
2941a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu                } else {
2951a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu                    if (receiverInfo.nextPullTimeNs < minNextPullTimeNs) {
2961a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu                        minNextPullTimeNs = receiverInfo.nextPullTimeNs;
2971a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu                    }
298b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu                }
299b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu            }
300b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu            if (receivers.size() > 0) {
301b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu                needToPull.push_back(make_pair(pair.first, receivers));
302b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu            }
303b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu        }
304b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    }
305b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu
306b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    for (const auto& pullInfo : needToPull) {
3075305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu        vector<shared_ptr<LogEvent>> data;
3081a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        if (Pull(pullInfo.first, currentTimeNs, &data)) {
3095305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu            for (const auto& receiverInfo : pullInfo.second) {
3106736c893a73c567d3794d88ae0d17abab34b7a6fChenjie Yu                sp<PullDataReceiver> receiverPtr = receiverInfo->receiver.promote();
3116736c893a73c567d3794d88ae0d17abab34b7a6fChenjie Yu                if (receiverPtr != nullptr) {
3126736c893a73c567d3794d88ae0d17abab34b7a6fChenjie Yu                    receiverPtr->onDataPulled(data);
3131a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu                    // we may have just come out of a coma, compute next pull time
3141a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu                    receiverInfo->nextPullTimeNs =
31515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                            (currentTimeNs - receiverInfo->nextPullTimeNs) /
31615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                                receiverInfo->intervalNs * receiverInfo->intervalNs +
31715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                            receiverInfo->intervalNs + receiverInfo->nextPullTimeNs;
3181a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu                    if (receiverInfo->nextPullTimeNs < minNextPullTimeNs) {
3191a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu                        minNextPullTimeNs = receiverInfo->nextPullTimeNs;
3201a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu                    }
3216736c893a73c567d3794d88ae0d17abab34b7a6fChenjie Yu                } else {
3226736c893a73c567d3794d88ae0d17abab34b7a6fChenjie Yu                    VLOG("receiver already gone.");
3236736c893a73c567d3794d88ae0d17abab34b7a6fChenjie Yu                }
3245305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu            }
325b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu        }
326b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    }
3271a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu
3283b3adcd8b617803e276b793112f55494a84a89dfChenjie Yu    VLOG("mNextPullTimeNs: %lld updated to %lld", (long long)mNextPullTimeNs,
3293b3adcd8b617803e276b793112f55494a84a89dfChenjie Yu         (long long)minNextPullTimeNs);
3301a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu    mNextPullTimeNs = minNextPullTimeNs;
3311a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu    updateAlarmLocked();
332b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu}
333b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu
334fa22d65f146c94873ba98b768b08c643424c4477Chenjie Yuint StatsPullerManagerImpl::ForceClearPullerCache() {
335fa22d65f146c94873ba98b768b08c643424c4477Chenjie Yu    int totalCleared = 0;
33680f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yu    for (const auto& pulledAtom : kAllPullAtomInfo) {
33780f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yu        totalCleared += pulledAtom.second.puller->ForceClearCache();
338e72252b6886096eef308164b830fe84dd3c6c01dChenjie Yu    }
339fa22d65f146c94873ba98b768b08c643424c4477Chenjie Yu    return totalCleared;
340fa22d65f146c94873ba98b768b08c643424c4477Chenjie Yu}
341fa22d65f146c94873ba98b768b08c643424c4477Chenjie Yu
3421a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yuint StatsPullerManagerImpl::ClearPullerCacheIfNecessary(int64_t timestampNs) {
343fa22d65f146c94873ba98b768b08c643424c4477Chenjie Yu    int totalCleared = 0;
34480f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yu    for (const auto& pulledAtom : kAllPullAtomInfo) {
3451a0a941c20eb746868d0de52e3806f69c74d335fChenjie Yu        totalCleared += pulledAtom.second.puller->ClearCacheIfNecessary(timestampNs);
346fa22d65f146c94873ba98b768b08c643424c4477Chenjie Yu    }
347fa22d65f146c94873ba98b768b08c643424c4477Chenjie Yu    return totalCleared;
348e72252b6886096eef308164b830fe84dd3c6c01dChenjie Yu}
349e72252b6886096eef308164b830fe84dd3c6c01dChenjie Yu
350c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz}  // namespace statsd
351c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz}  // namespace os
352c68a9d21b47f4c2fb65139c10d646145a9ab9a73Bookatz}  // namespace android
353