1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/arc/tracing/arc_value_event.h"
namespace arc {
ArcValueEvent::ArcValueEvent(int64_t timestamp, Type type, int value)
: timestamp(timestamp), type(type), value(value) {}
bool ArcValueEvent::operator==(const ArcValueEvent& other) const {
return timestamp == other.timestamp && type == other.type &&
value == other.value;
}
base::Value::List SerializeValueEvents(const ValueEvents& value_events) {
base::Value::List list;
for (const auto& event : value_events) {
base::Value::List event_value;
event_value.Append(base::Value(static_cast<int>(event.type)));
event_value.Append(base::Value(static_cast<double>(event.timestamp)));
event_value.Append(base::Value(event.value));
list.Append(std::move(event_value));
}
return list;
}
bool LoadValueEvents(const base::Value* value, ValueEvents* value_events) {
if (!value || !value->is_list()) {
return false;
}
int64_t previous_timestamp = 0;
for (const auto& entry : value->GetList()) {
if (!entry.is_list() || entry.GetList().size() != 3) {
return false;
}
if (!entry.GetList()[0].is_int()) {
return false;
}
const ArcValueEvent::Type type =
static_cast<ArcValueEvent::Type>(entry.GetList()[0].GetInt());
switch (type) {
case ArcValueEvent::Type::kMemTotal:
case ArcValueEvent::Type::kMemUsed:
case ArcValueEvent::Type::kSwapRead:
case ArcValueEvent::Type::kSwapWrite:
case ArcValueEvent::Type::kSwapWait:
case ArcValueEvent::Type::kGemObjects:
case ArcValueEvent::Type::kGemSize:
case ArcValueEvent::Type::kGpuFrequency:
case ArcValueEvent::Type::kCpuTemperature:
case ArcValueEvent::Type::kCpuFrequency:
case ArcValueEvent::Type::kCpuPower:
case ArcValueEvent::Type::kGpuPower:
case ArcValueEvent::Type::kMemoryPower:
case ArcValueEvent::Type::kPackagePowerConstraint:
break;
default:
return false;
}
if (!entry.GetList()[1].is_double() && !entry.GetList()[1].is_int()) {
return false;
}
const int64_t timestamp = entry.GetList()[1].GetDouble();
if (timestamp < previous_timestamp) {
return false;
}
if (!entry.GetList()[2].is_int()) {
return false;
}
value_events->emplace_back(timestamp, type, entry.GetList()[2].GetInt());
previous_timestamp = timestamp;
}
return true;
}
std::ostream& operator<<(std::ostream& os, ArcValueEvent::Type event_type) {
return os << static_cast<
typename std::underlying_type<ArcValueEvent::Type>::type>(
event_type);
}
} // namespace arc
|