utils.h revision 621a533ec28dbbf8634211c684456b4bbc1bc0fb
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> 24323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui#include <string> 259759e1b1ce76185aa539aeea2fb1cbd8382156e7Yabin Cui#include <vector> 2667d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui 277d59bb49fb47fbc82ef5c77d7aebf7174fd996e1Yabin Cui#define ALIGN(value, alignment) (((value) + (alignment)-1) & ~((alignment)-1)) 2867d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui 29323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cuiclass LineReader { 30323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui public: 31323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui LineReader(FILE* fp) : fp_(fp), buf_(nullptr), bufsize_(0) { 32323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui } 33323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui 34323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui ~LineReader() { 35323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui free(buf_); 36323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui fclose(fp_); 37323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui } 38323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui 39323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui char* ReadLine() { 40323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui if (getline(&buf_, &bufsize_, fp_) != -1) { 41323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui return buf_; 42323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui } 43323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui return nullptr; 44323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui } 45323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui 46323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui size_t MaxLineSize() { 47323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui return bufsize_; 48323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui } 49323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui 50323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui private: 51323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui FILE* fp_; 52323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui char* buf_; 53323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui size_t bufsize_; 54323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui}; 55323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui 56621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cuiclass SignalHandlerRegister { 57621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui public: 58621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui SignalHandlerRegister(const std::vector<int>& signums, void (*handler)(int)) { 59621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui for (auto& sig : signums) { 60621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui sighandler_t old_handler = signal(sig, handler); 61621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui saved_signal_handlers_.push_back(std::make_pair(sig, old_handler)); 62621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui } 63621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui } 64621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui 65621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui ~SignalHandlerRegister() { 66621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui for (auto& pair : saved_signal_handlers_) { 67621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui signal(pair.first, pair.second); 68621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui } 69621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui } 70621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui 71621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui private: 72621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui std::vector<std::pair<int, sighandler_t>> saved_signal_handlers_; 73621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui}; 74621a533ec28dbbf8634211c684456b4bbc1bc0fbYabin Cui 757d59bb49fb47fbc82ef5c77d7aebf7174fd996e1Yabin Cuivoid PrintIndented(size_t indent, const char* fmt, ...); 767d59bb49fb47fbc82ef5c77d7aebf7174fd996e1Yabin Cui 779759e1b1ce76185aa539aeea2fb1cbd8382156e7Yabin Cuibool IsPowerOfTwo(uint64_t value); 789759e1b1ce76185aa539aeea2fb1cbd8382156e7Yabin Cui 797d59bb49fb47fbc82ef5c77d7aebf7174fd996e1Yabin Cuivoid GetEntriesInDir(const std::string& dirpath, std::vector<std::string>* files, 807d59bb49fb47fbc82ef5c77d7aebf7174fd996e1Yabin Cui std::vector<std::string>* subdirs); 81323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui 8267d3abd7b26a741347b33402ad32f5c6735ca0bdYabin Cui#endif // SIMPLE_PERF_UTILS_H_ 83