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