blob: cea41d0e6243446d5d01de796c5d133fe9a1e23c [file] [log] [blame]
// Copyright 2019 The Chromium 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 CHROME_BROWSER_CHROMEOS_ARC_TRACING_ARC_TRACING_EVENT_H_
#define CHROME_BROWSER_CHROMEOS_ARC_TRACING_ARC_TRACING_EVENT_H_
#include <stddef.h>
#include <memory>
#include <string>
#include <vector>
#include "base/macros.h"
#include "base/values.h"
namespace arc {
// |ArcTracingEvent| is a wrapper over |base::DictionaryValue| that is used to
// represent trace event in Chrome. |ArcTracingEvent| is hierarchical and
// can contain children. Setter methods are used to convert system trace events
// that are not dictionary based to the common Chrome format.
class ArcTracingEvent {
public:
enum class Position {
kBefore, // event is before the compared event
kInside, // event is inside the compared event.
kAfter, // event is after the compared event.
kOverlap, // event overlaps with compared event.
};
explicit ArcTracingEvent(base::Value dictionary);
~ArcTracingEvent();
// Gets process id of the event. Returns 0 if not set.
int GetPid() const;
// Sets process id of the event.
void SetPid(int pid);
// Gets thread id of the event. Returns 0 if not set.
int GetTid() const;
// Sets thread id of the event.
void SetTid(int tid);
// Gets id of the group of events. Returns empty string if not set.
std::string GetId() const;
// Sets id of the event.
void SetId(const std::string& id);
// Gets category of the event. Returns empty string if not set.
std::string GetCategory() const;
// Sets category of the event.
void SetCategory(const std::string& category);
// Gets name of the event. Returns empty string if not set.
std::string GetName() const;
// Sets name of the event.
void SetName(const std::string& name);
// Gets phase of the event. Returns 0 if not set.
char GetPhase() const;
// Sets phase of the event.
void SetPhase(char phase);
// Gets timestamp of the start of the event. Return 0 if not set.
uint64_t GetTimestamp() const;
// Sets timestamp of the start of the event.
void SetTimestamp(uint64_t timestamp);
// Gets duration of the event. Return 0 if not set. It is optional for some
// events.
uint64_t GetDuration() const;
// Sets duration of the event.
void SetDuration(uint64_t duration);
// Gets timestamp of the end of the event.
uint64_t GetEndTimestamp() const;
// Returns base representation of the event as a |base::DictionaryValue|.
const base::DictionaryValue* GetDictionary() const;
// Returns set of arguments as a |base::DictionaryValue|.
const base::DictionaryValue* GetArgs() const;
// Gets argument as string. Return |default_value| if not found.
std::string GetArgAsString(const std::string& name,
const std::string& default_value) const;
// Gets argument as integer. Returns |default_value| if not found.
int GetArgAsInteger(const std::string& name, int default_value) const;
// Gets argument as double. Returns |default_value| if not found.
double GetArgAsDouble(const std::string& name, double default_value) const;
// Classifies the position of another event relative to the current event.
Position ClassifyPositionOf(const ArcTracingEvent& other) const;
// Recursively adds child trace event. If child event is not inside the
// current event than child event is not added and false is returned.
// Based on building constraints, child element can be appended to the end
// of the list of child events or to the last child event.
bool AppendChild(std::unique_ptr<ArcTracingEvent> child);
// Validates that event contains correct information.
bool Validate() const;
// Returns string representation of this event.
std::string ToString() const;
// Dumps this event and its children to |stream|. |prefix| is used for
// formatting.
void Dump(const std::string& prefix, std::ostream& stream) const;
const std::vector<std::unique_ptr<ArcTracingEvent>>& children() const {
return children_;
}
private:
std::vector<std::unique_ptr<ArcTracingEvent>> children_;
base::Value dictionary_;
DISALLOW_COPY_AND_ASSIGN(ArcTracingEvent);
};
} // namespace arc
#endif // CHROME_BROWSER_CHROMEOS_ARC_TRACING_ARC_TRACING_EVENT_H_