blob: b70b0b8ed763c792519a32572383bb5bc106bde9 [file] [log] [blame]
// Copyright 2016 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_BIN_TRACE_COMMANDS_RECORD_H_
#define GARNET_BIN_TRACE_COMMANDS_RECORD_H_
#include <memory>
#include <string>
#include <vector>
#include "garnet/bin/trace/command.h"
#include "garnet/bin/trace/spec.h"
#include "garnet/bin/trace/tracer.h"
#include "garnet/lib/measure/argument_value.h"
#include "garnet/lib/measure/duration.h"
#include "garnet/lib/measure/measurements.h"
#include "garnet/lib/measure/time_between.h"
#include "garnet/lib/trace_converters/chromium_exporter.h"
#include "lib/fxl/memory/weak_ptr.h"
#include "lib/fxl/time/time_delta.h"
namespace tracing {
class Record : public CommandWithTraceController {
public:
struct Options {
bool Setup(const fxl::CommandLine&);
std::string test_name;
std::string app;
std::vector<std::string> args;
std::vector<std::string> categories = {};
fxl::TimeDelta duration = fxl::TimeDelta::FromSeconds(10);
bool detach = false;
bool decouple = false;
bool spawn = false;
uint32_t buffer_size_megabytes = 4;
fuchsia::tracing::BufferingMode buffering_mode =
fuchsia::tracing::BufferingMode::ONESHOT;
bool compress = false;
std::string output_file_name = "/data/trace.json";
std::string benchmark_results_file;
std::string test_suite;
measure::Measurements measurements;
};
static Info Describe();
explicit Record(component::StartupContext* context);
protected:
void Start(const fxl::CommandLine& command_line) override;
private:
void StopTrace(int32_t return_code);
void ProcessMeasurements();
void DoneTrace();
void LaunchApp();
void LaunchTool();
void StartTimer();
fuchsia::sys::ComponentControllerPtr component_controller_;
std::unique_ptr<ChromiumExporter> exporter_;
std::unique_ptr<Tracer> tracer_;
// Aggregate events if there are any measurements to be performed, so that we
// can sort them by timestamp and process in order.
bool aggregate_events_ = false;
// This is actually a vector of trace::Record::Event, but it isn't
// copyable so we record the entire Record here (which also isn't copyable
// but it is movable).
std::vector<trace::Record> events_;
std::unique_ptr<measure::MeasureDuration> measure_duration_;
std::unique_ptr<measure::MeasureTimeBetween> measure_time_between_;
std::unique_ptr<measure::MeasureArgumentValue> measure_argument_value_;
bool tracing_ = false;
int32_t return_code_ = 0;
Options options_;
fxl::WeakPtrFactory<Record> weak_ptr_factory_;
};
} // namespace tracing
#endif // GARNET_BIN_TRACE_COMMANDS_RECORD_H_