summaryrefslogtreecommitdiff
path: root/DevTools/ProfileViewer/Profile.h
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-12-14 18:44:29 +0100
committerAndreas Kling <awesomekling@gmail.com>2019-12-14 18:44:29 +0100
commita3e7c99ffea8bd5f70edf9d6ef941c4e7303833f (patch)
tree6a4577fc2d7c6f74f4d4172fa6d7e32e244318b0 /DevTools/ProfileViewer/Profile.h
parent46a57c7f5905b8d82f1c810df8b6cc5a7f5970a6 (diff)
downloadserenity-a3e7c99ffea8bd5f70edf9d6ef941c4e7303833f.zip
ProfileViewer: Add a timeline widget for a visual view of the profile
Userspace stack frames are in blue, kernel stack frames in red :^)
Diffstat (limited to 'DevTools/ProfileViewer/Profile.h')
-rw-r--r--DevTools/ProfileViewer/Profile.h29
1 files changed, 23 insertions, 6 deletions
diff --git a/DevTools/ProfileViewer/Profile.h b/DevTools/ProfileViewer/Profile.h
index 0b78f82d16..13c83beb46 100644
--- a/DevTools/ProfileViewer/Profile.h
+++ b/DevTools/ProfileViewer/Profile.h
@@ -11,14 +11,15 @@ class ProfileModel;
class ProfileNode : public RefCounted<ProfileNode> {
public:
- static NonnullRefPtr<ProfileNode> create(const String& symbol, u32 address, u32 offset)
+ static NonnullRefPtr<ProfileNode> create(const String& symbol, u32 address, u32 offset, u64 timestamp)
{
- return adopt(*new ProfileNode(symbol, address, offset));
+ return adopt(*new ProfileNode(symbol, address, offset, timestamp));
}
const String& symbol() const { return m_symbol; }
u32 address() const { return m_address; }
u32 offset() const { return m_offset; }
+ u64 timestamp() const { return m_timestamp; }
u32 sample_count() const { return m_sample_count; }
@@ -34,7 +35,7 @@ public:
m_children.append(child);
}
- ProfileNode& find_or_create_child(const String& symbol, u32 address, u32 offset)
+ ProfileNode& find_or_create_child(const String& symbol, u32 address, u32 offset, u64 timestamp)
{
for (int i = 0; i < m_children.size(); ++i) {
auto& child = m_children[i];
@@ -42,7 +43,7 @@ public:
return child;
}
}
- auto new_child = ProfileNode::create(symbol, address, offset);
+ auto new_child = ProfileNode::create(symbol, address, offset, timestamp);
add_child(new_child);
return new_child;
};
@@ -55,10 +56,11 @@ public:
void sort_children();
private:
- explicit ProfileNode(const String& symbol, u32 address, u32 offset)
+ explicit ProfileNode(const String& symbol, u32 address, u32 offset, u64 timestamp)
: m_symbol(symbol)
, m_address(address)
, m_offset(offset)
+ , m_timestamp(timestamp)
{
}
@@ -67,6 +69,7 @@ private:
u32 m_address { 0 };
u32 m_offset { 0 };
u32 m_sample_count { 0 };
+ u64 m_timestamp { 0 };
Vector<NonnullRefPtr<ProfileNode>> m_children;
};
@@ -79,10 +82,24 @@ public:
const Vector<NonnullRefPtr<ProfileNode>>& roots() const { return m_roots; }
+ template<typename Callback>
+ void for_each_sample(Callback callback)
+ {
+ m_json.for_each([&](auto& value) {
+ callback(value.as_object());
+ });
+ }
+
+ u64 length_in_ms() const { return m_last_timestamp - m_first_timestamp; }
+ u64 first_timestamp() const { return m_first_timestamp; }
+ u64 last_timestamp() const { return m_first_timestamp; }
+
private:
- explicit Profile(const JsonArray&, Vector<NonnullRefPtr<ProfileNode>>&&);
+ explicit Profile(const JsonArray&, Vector<NonnullRefPtr<ProfileNode>>&&, u64 first_timestamp, u64 last_timestamp);
JsonArray m_json;
RefPtr<ProfileModel> m_model;
Vector<NonnullRefPtr<ProfileNode>> m_roots;
+ u64 m_first_timestamp { 0 };
+ u64 m_last_timestamp { 0 };
};