17e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 27e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Use of this source code is governed by a BSD-style license that can be 37e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// found in the LICENSE file. 47e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 57e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#ifndef CHROMIUMOS_WIDE_PROFILING_UTILS_H_ 67e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#define CHROMIUMOS_WIDE_PROFILING_UTILS_H_ 77e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 87e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include <stdint.h> 97e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include <stdlib.h> // for free() 107e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 117e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include <memory> 127e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include <string> 137e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include <vector> 147e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 157e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include "base/logging.h" 167e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 177e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include "perf_internals.h" 187e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#include "quipper_string.h" 197e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 207e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshnamespace quipper { 217e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 227e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshstruct FreeDeleter { 237e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh inline void operator()(void* pointer) { 247e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh free(pointer); 257e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh } 267e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh}; 277e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 287e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshtemplate <typename T> 297e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshusing malloced_unique_ptr = std::unique_ptr<T, FreeDeleter>; 307e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 317e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Given a valid open file handle |fp|, returns the size of the file. 327e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshint64_t GetFileSizeFromHandle(FILE* fp); 337e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 347e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshevent_t* CallocMemoryForEvent(size_t size); 357e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshevent_t* ReallocMemoryForEvent(event_t* event, size_t new_size); 367e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 377e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshbuild_id_event* CallocMemoryForBuildID(size_t size); 387e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 397e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshbool FileToBuffer(const string& filename, std::vector<char>* contents); 407e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 417e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshtemplate <typename CharContainer> 427e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshbool BufferToFile(const string& filename, const CharContainer& contents) { 437e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh FILE* fp = fopen(filename.c_str(), "wb"); 447e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh if (!fp) 457e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return false; 467e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // Do not write anything if |contents| contains nothing. fopen will create 477e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh // an empty file. 487e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh if (!contents.empty()) { 497e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh CHECK_EQ(fwrite(contents.data(), 507e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh sizeof(typename CharContainer::value_type), 517e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh contents.size(), 527e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh fp), 537e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh contents.size()); 547e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh } 557e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh fclose(fp); 567e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh return true; 577e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh} 587e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 597e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshuint64_t Md5Prefix(const string& input); 607e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshuint64_t Md5Prefix(const std::vector<char>& input); 617e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 627e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Returns a string that represents |array| in hexadecimal. 637e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshstring HexToString(const u8* array, size_t length); 647e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 657e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Converts |str| to a hexadecimal number, stored in |array|. Returns true on 667e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// success. Only stores up to |length| bytes - if there are more characters in 677e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// the string, they are ignored (but the function may still return true). 687e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshbool StringToHex(const string& str, u8* array, size_t length); 697e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 707e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Adjust |size| to blocks of |align_size|. i.e. returns the smallest multiple 717e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// of |align_size| that can fit |size|. 727e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshuint64_t AlignSize(uint64_t size, uint32_t align_size); 737e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 747e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Given a general perf sample format |sample_type|, return the fields of that 757e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// format that are present in a sample for an event of type |event_type|. 767e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// 777e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// e.g. FORK and EXIT events have the fields {time, pid/tid, cpu, id}. 787e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Given a sample type with fields {ip, time, pid/tid, and period}, return 797e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// the intersection of these two field sets: {time, pid/tid}. 807e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// 817e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// All field formats are bitfields, as defined by enum perf_event_sample_format 827e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// in kernel/perf_event.h. 837e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshuint64_t GetSampleFieldsForEventType(uint32_t event_type, uint64_t sample_type); 847e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 857e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Returns the offset in bytes within a perf event structure at which the raw 867e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// perf sample data is located. 877e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshuint64_t GetPerfSampleDataOffset(const event_t& event); 887e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 897e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Returns the size of the 8-byte-aligned memory for storing |string|. 907e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshsize_t GetUint64AlignedStringLength(const string& str); 917e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 927e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Returns true iff the file exists. 937e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshbool FileExists(const string& filename); 947e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 957e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Reads the contents of a file into |data|. Returns true on success, false if 967e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// it fails. 977e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshbool ReadFileToData(const string& filename, std::vector<char>* data); 987e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 997e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Writes contents of |data| to a file with name |filename|, overwriting any 1007e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// existing file. Returns true on success, false if it fails. 1017e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshbool WriteDataToFile(const std::vector<char>& data, const string& filename); 1027e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1037e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Executes |command| and stores stdout output in |output|. Returns true on 1047e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// success, false otherwise. 1057e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshbool RunCommandAndGetStdout(const string& command, std::vector<char>* output); 1067e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1077e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh// Trim leading and trailing whitespace from |str|. 1087e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntoshvoid TrimWhitespace(string* str); 1097e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1107e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh} // namespace quipper 1117e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh 1127e2f4e9d384d501cf86118ebac4b8de2b86eac53Than McIntosh#endif // CHROMIUMOS_WIDE_PROFILING_UTILS_H_ 113