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