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