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