utils.h revision cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8
167d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui/* 267d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui * Copyright (C) 2015 The Android Open Source Project 367d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui * 467d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui * Licensed under the Apache License, Version 2.0 (the "License"); 567d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui * you may not use this file except in compliance with the License. 667d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui * You may obtain a copy of the License at 767d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui * 867d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui * http://www.apache.org/licenses/LICENSE-2.0 967d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui * 1067d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui * Unless required by applicable law or agreed to in writing, software 1167d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui * distributed under the License is distributed on an "AS IS" BASIS, 1267d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1367d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui * See the License for the specific language governing permissions and 1467d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui * limitations under the License. 1567d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui */ 1667d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui 1767d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui#ifndef SIMPLE_PERF_UTILS_H_ 1867d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui#define SIMPLE_PERF_UTILS_H_ 1967d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui 20621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui#include <signal.h> 2167d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui#include <stddef.h> 22323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui#include <stdio.h> 23323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui#include <stdlib.h> 24cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui 25323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui#include <string> 269759e1b1ce76185aa539aeea2fb1cbd8382156e7Yabin Cui#include <vector> 2767d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui 287d59bb49fb47fbc82ef5c77d7aebf7174fd996e1Yabin Cui#define ALIGN(value, alignment) (((value) + (alignment)-1) & ~((alignment)-1)) 2967d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui 30323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cuiclass LineReader { 31323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui public: 32323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui LineReader(FILE* fp) : fp_(fp), buf_(nullptr), bufsize_(0) { 33323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui } 34323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui 35323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui ~LineReader() { 36323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui free(buf_); 37323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui fclose(fp_); 38323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui } 39323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui 40323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui char* ReadLine() { 41323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui if (getline(&buf_, &bufsize_, fp_) != -1) { 42323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui return buf_; 43323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui } 44323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui return nullptr; 45323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui } 46323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui 47323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui size_t MaxLineSize() { 48323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui return bufsize_; 49323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui } 50323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui 51323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui private: 52323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui FILE* fp_; 53323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui char* buf_; 54323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui size_t bufsize_; 55323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui}; 56323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui 57621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cuiclass SignalHandlerRegister { 58621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui public: 59621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui SignalHandlerRegister(const std::vector<int>& signums, void (*handler)(int)) { 60621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui for (auto& sig : signums) { 619fd3cc1048a3d0338df4a48760dfd655560992a1Yabin Cui sig_t old_handler = signal(sig, handler); 62621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui saved_signal_handlers_.push_back(std::make_pair(sig, old_handler)); 63621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui } 64621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui } 65621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui 66621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui ~SignalHandlerRegister() { 67621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui for (auto& pair : saved_signal_handlers_) { 68621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui signal(pair.first, pair.second); 69621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui } 70621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui } 71621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui 72621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui private: 739fd3cc1048a3d0338df4a48760dfd655560992a1Yabin Cui std::vector<std::pair<int, sig_t>> saved_signal_handlers_; 74621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui}; 75621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui 76cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui// OneTimeAllocator is used to allocate memory many times and free only once at the end. 77cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui// It reduces the cost to free each allocated memory. 78cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cuiclass OneTimeFreeAllocator { 79cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui public: 80cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui OneTimeFreeAllocator(size_t unit_size = 8192u) 81cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui : unit_size_(unit_size), cur_(nullptr), end_(nullptr) { 82cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui } 83cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui 84cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui ~OneTimeFreeAllocator() { 85cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui Clear(); 86cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui } 87cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui 88cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui void Clear(); 89cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui const char* AllocateString(const std::string& s); 90cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui 91cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui private: 92cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui const size_t unit_size_; 93cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui std::vector<char*> v_; 94cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui char* cur_; 95cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui char* end_; 96cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui}; 97cc2e59e2478d330c89eaceda0dcc1f05ee32fbf8Yabin Cui 98d713f959ec1fe07ed993e2c9f4166b52aa98a58cYabin Cuitemplate <class T> 99d713f959ec1fe07ed993e2c9f4166b52aa98a58cYabin Cuivoid MoveFromBinaryFormat(T& data, const char*& p) { 100d713f959ec1fe07ed993e2c9f4166b52aa98a58cYabin Cui data = *reinterpret_cast<const T*>(p); 101d713f959ec1fe07ed993e2c9f4166b52aa98a58cYabin Cui p += sizeof(T); 102d713f959ec1fe07ed993e2c9f4166b52aa98a58cYabin Cui} 103d713f959ec1fe07ed993e2c9f4166b52aa98a58cYabin Cui 1047d59bb49fb47fbc82ef5c77d7aebf7174fd996e1Yabin Cuivoid PrintIndented(size_t indent, const char* fmt, ...); 1057d59bb49fb47fbc82ef5c77d7aebf7174fd996e1Yabin Cui 1069759e1b1ce76185aa539aeea2fb1cbd8382156e7Yabin Cuibool IsPowerOfTwo(uint64_t value); 1079759e1b1ce76185aa539aeea2fb1cbd8382156e7Yabin Cui 1087d59bb49fb47fbc82ef5c77d7aebf7174fd996e1Yabin Cuivoid GetEntriesInDir(const std::string& dirpath, std::vector<std::string>* files, 1097d59bb49fb47fbc82ef5c77d7aebf7174fd996e1Yabin Cui std::vector<std::string>* subdirs); 110b032de7a9e1975a838cd6df2e7c8df3c7f70a3ceYabin Cuibool IsDir(const std::string& dirpath); 1116afc7e17d39ab294bdf625076777443a6b4c8e18Yabin Cuibool RemovePossibleFile(const std::string& filename); 11238e573ee1958959253ba8f3af7567adb4cbeea55Yabin Cuibool StringToPid(const std::string& s, int* pid); 113323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui 11467d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui#endif // SIMPLE_PERF_UTILS_H_ 115