summaryrefslogtreecommitdiff
path: root/DevTools/ProfileViewer/Profile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'DevTools/ProfileViewer/Profile.cpp')
-rw-r--r--DevTools/ProfileViewer/Profile.cpp22
1 files changed, 15 insertions, 7 deletions
diff --git a/DevTools/ProfileViewer/Profile.cpp b/DevTools/ProfileViewer/Profile.cpp
index 0196635d7c..4c24ae4394 100644
--- a/DevTools/ProfileViewer/Profile.cpp
+++ b/DevTools/ProfileViewer/Profile.cpp
@@ -4,9 +4,11 @@
#include <LibCore/CFile.h>
#include <stdio.h>
-Profile::Profile(const JsonArray& json, Vector<NonnullRefPtr<ProfileNode>>&& roots)
+Profile::Profile(const JsonArray& json, Vector<NonnullRefPtr<ProfileNode>>&& roots, u64 first_timestamp, u64 last_timestamp)
: m_json(json)
, m_roots(move(roots))
+ , m_first_timestamp(first_timestamp)
+ , m_last_timestamp(last_timestamp)
{
m_model = ProfileModel::create(*this);
}
@@ -34,22 +36,27 @@ OwnPtr<Profile> Profile::load_from_file(const StringView& path)
return nullptr;
}
- auto samples = json.as_array();
+ auto& samples = json.as_array();
+ if (samples.is_empty())
+ return nullptr;
NonnullRefPtrVector<ProfileNode> roots;
- auto find_or_create_root = [&roots](const String& symbol, u32 address, u32 offset) -> ProfileNode& {
+ auto find_or_create_root = [&roots](const String& symbol, u32 address, u32 offset, u64 timestamp) -> ProfileNode& {
for (int i = 0; i < roots.size(); ++i) {
auto& root = roots[i];
if (root.symbol() == symbol) {
return root;
}
}
- auto new_root = ProfileNode::create(symbol, address, offset);
+ auto new_root = ProfileNode::create(symbol, address, offset, timestamp);
roots.append(new_root);
return new_root;
};
+ u64 first_timestamp = samples.at(0).as_object().get("timestamp").to_number<u64>();
+ u64 last_timestamp = samples.at(samples.size() - 1).as_object().get("timestamp").to_number<u64>();
+
samples.for_each([&](const JsonValue& sample) {
auto frames_value = sample.as_object().get("frames");
auto& frames = frames_value.as_array();
@@ -60,14 +67,15 @@ OwnPtr<Profile> Profile::load_from_file(const StringView& path)
auto symbol = frame.as_object().get("symbol").as_string_or({});
auto address = frame.as_object().get("address").as_u32();
auto offset = frame.as_object().get("offset").as_u32();
+ auto timestamp = frame.as_object().get("timestamp").to_number<u64>();
if (symbol.is_empty())
break;
if (!node)
- node = &find_or_create_root(symbol, address, offset);
+ node = &find_or_create_root(symbol, address, offset, timestamp);
else
- node = &node->find_or_create_child(symbol, address, offset);
+ node = &node->find_or_create_child(symbol, address, offset, timestamp);
node->increment_sample_count();
}
@@ -77,7 +85,7 @@ OwnPtr<Profile> Profile::load_from_file(const StringView& path)
root.sort_children();
}
- return NonnullOwnPtr<Profile>(NonnullOwnPtr<Profile>::Adopt, *new Profile(move(samples), move(roots)));
+ return NonnullOwnPtr<Profile>(NonnullOwnPtr<Profile>::Adopt, *new Profile(move(samples), move(roots), first_timestamp, last_timestamp));
}
void ProfileNode::sort_children()