// Copyright 2016 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "perf_data_utils.h" #include <string> #include "base/logging.h" #include "compat/proto.h" namespace quipper { event_t* CallocMemoryForEvent(size_t size) { event_t* event = reinterpret_cast<event_t*>(calloc(1, size)); CHECK(event); return event; } event_t* ReallocMemoryForEvent(event_t* event, size_t new_size) { event_t* new_event = reinterpret_cast<event_t*>(realloc(event, new_size)); CHECK(new_event); // NB: event is "leaked" if this CHECK fails. return new_event; } build_id_event* CallocMemoryForBuildID(size_t size) { build_id_event* event = reinterpret_cast<build_id_event*>(calloc(1, size)); CHECK(event); return event; } void PerfizeBuildIDString(string* build_id) { build_id->resize(kBuildIDStringLength, '0'); } void TrimZeroesFromBuildIDString(string* build_id) { const size_t kPaddingSize = 8; const string kBuildIDPadding = string(kPaddingSize, '0'); // Remove kBuildIDPadding from the end of build_id until we cannot remove any // more. The build ID string can be reduced down to an empty string. This // could happen if the file did not have a build ID but was given a build ID // of all zeroes. The empty build ID string would reflect the original lack of // build ID. while (build_id->size() >= kPaddingSize && build_id->substr(build_id->size() - kPaddingSize) == kBuildIDPadding) { build_id->resize(build_id->size() - kPaddingSize); } } const PerfDataProto_SampleInfo* GetSampleInfoForEvent( const PerfDataProto_PerfEvent& event) { switch (event.header().type()) { case PERF_RECORD_MMAP: case PERF_RECORD_MMAP2: return &event.mmap_event().sample_info(); case PERF_RECORD_COMM: return &event.comm_event().sample_info(); case PERF_RECORD_FORK: return &event.fork_event().sample_info(); case PERF_RECORD_EXIT: return &event.exit_event().sample_info(); case PERF_RECORD_LOST: return &event.lost_event().sample_info(); case PERF_RECORD_THROTTLE: case PERF_RECORD_UNTHROTTLE: return &event.throttle_event().sample_info(); case PERF_RECORD_READ: return &event.read_event().sample_info(); case PERF_RECORD_AUX: return &event.aux_event().sample_info(); } return nullptr; } // Returns the correct |sample_time_ns| field of a PerfEvent. uint64_t GetTimeFromPerfEvent(const PerfDataProto_PerfEvent& event) { if (event.header().type() == PERF_RECORD_SAMPLE) return event.sample_event().sample_time_ns(); const auto* sample_info = GetSampleInfoForEvent(event); if (sample_info) return sample_info->sample_time_ns(); return 0; } } // namespace quipper