| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef GARNET_LIB_MEASURE_TIME_BETWEEN_H_ |
| #define GARNET_LIB_MEASURE_TIME_BETWEEN_H_ |
| |
| #include <map> |
| #include <stack> |
| #include <unordered_map> |
| #include <vector> |
| |
| #include <trace-reader/reader.h> |
| |
| #include "garnet/lib/measure/event_spec.h" |
| #include "lib/fxl/macros.h" |
| |
| namespace tracing { |
| namespace measure { |
| |
| // Indicates whether the beginning or an end of the trace event is targeted. |
| enum class Anchor { Begin, End }; |
| |
| // A "time_between" measurement targets two events and measures time between |
| // their consecutive occurences. |
| struct TimeBetweenSpec { |
| MeasurementSpecCommon common; |
| EventSpec first_event; |
| Anchor first_anchor; |
| EventSpec second_event; |
| Anchor second_anchor; |
| }; |
| |
| class MeasureTimeBetween { |
| public: |
| explicit MeasureTimeBetween(std::vector<TimeBetweenSpec> specs); |
| |
| // Processes a recorded trace event. Returns true on success and false if the |
| // record was ignored due to an error in the provided data. Trace events must |
| // be processed in non-decreasing order of timestamps. |
| bool Process(const trace::Record::Event& event); |
| |
| // Returns the results of the measurements. The results are represented as a |
| // map of measurement ids to lists of time deltas representing the performed |
| // measurements. |
| // |
| // For each pair of a first event occurence followed by a second event |
| // occurence (with no other occurences of either event in between), the |
| // results contain the duration between the two. |
| const std::unordered_map<uint64_t, std::vector<uint64_t>>& results() { |
| return results_; |
| } |
| |
| private: |
| bool ProcessInstant(const trace::Record::Event& event); |
| |
| void AddResult(uint64_t spec_id, trace_ticks_t from, trace_ticks_t to); |
| |
| std::vector<TimeBetweenSpec> specs_; |
| std::unordered_map<uint64_t, std::vector<uint64_t>> results_; |
| |
| // Maps ids of "time between" measurements to the timestamp of the most recent |
| // occurence of the first event. |
| std::unordered_map<uint64_t, trace_ticks_t> pending_time_between_; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(MeasureTimeBetween); |
| }; |
| |
| } // namespace measure |
| } // namespace tracing |
| |
| #endif // GARNET_LIB_MEASURE_TIME_BETWEEN_H_ |