ReportPerformance.cpp revision 80448085b6fa0dd9a78c4d7ca378d7ea5201595d
180448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager/* 280448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * Copyright (C) 2017 The Android Open Source Project 380448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * 480448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * Licensed under the Apache License, Version 2.0 (the "License"); 580448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * you may not use this file except in compliance with the License. 680448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * You may obtain a copy of the License at 780448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * 880448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * http://www.apache.org/licenses/LICENSE-2.0 980448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * 1080448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * Unless required by applicable law or agreed to in writing, software 1180448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * distributed under the License is distributed on an "AS IS" BASIS, 1280448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1380448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * See the License for the specific language governing permissions and 1480448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager * limitations under the License. 1580448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager */ 1680448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 1780448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#define LOG_TAG "ReportPerformance" 1880448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 1980448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <fstream> 2080448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <iostream> 2180448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <queue> 2280448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <stdarg.h> 2380448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <stdint.h> 2480448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <stdio.h> 2580448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <string.h> 2680448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <sys/prctl.h> 2780448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <utility> 2880448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <media/nbaio/NBLog.h> 2980448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <media/nbaio/PerformanceAnalysis.h> 3080448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <media/nbaio/ReportPerformance.h> 3180448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager// #include <utils/CallStack.h> // used to print callstack 3280448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <utils/Log.h> 3380448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager#include <utils/String8.h> 3480448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 3580448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wagernamespace android { 3680448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 3780448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wagernamespace ReportPerformance { 3880448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 3980448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager// Writes outlier intervals, timestamps, and histograms spanning long time intervals to a file. 4080448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager// TODO: format the data efficiently and write different types of data to different files 4180448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wagervoid writeToFile(std::deque<std::pair<outlierInterval, timestamp>> &outlierData, 4280448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager std::deque<std::pair<timestamp, Histogram>> &hists, 4380448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager const char * kName, 4480448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager bool append) { 4580448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager ALOGD("writing performance data to file"); 4680448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager if (outlierData.empty() || hists.empty()) { 4780448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager return; 4880448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager } 4980448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 5080448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager std::ofstream ofs; 5180448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager ofs.open(kName, append ? std::ios::app : std::ios::trunc); 5280448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager if (!ofs.is_open()) { 5380448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager ALOGW("couldn't open file %s", kName); 5480448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager return; 5580448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager } 5680448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager ofs << "Outlier data: interval and timestamp\n"; 5780448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager for (const auto &outlier : outlierData) { 5880448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager ofs << outlier.first << ": " << outlier.second << "\n"; 5980448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager } 6080448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager ofs << "Histogram data\n"; 6180448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager for (const auto &hist : hists) { 6280448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager ofs << "\ttimestamp\n"; 6380448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager ofs << hist.first << "\n"; 6480448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager ofs << "\tbuckets and counts\n"; 6580448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager for (const auto &bucket : hist.second) { 6680448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager ofs << bucket.first << ": " << bucket.second << "\n"; 6780448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager } 6880448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager } 6980448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager ofs.close(); 7080448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager} 7180448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 7280448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager} // namespace ReportPerformance 7380448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager 7480448085b6fa0dd9a78c4d7ca378d7ea5201595dSanna Catherine de Treville Wager} // namespace android 75