diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-12-14 18:44:29 +0100 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-12-14 18:44:29 +0100 |
commit | a3e7c99ffea8bd5f70edf9d6ef941c4e7303833f (patch) | |
tree | 6a4577fc2d7c6f74f4d4172fa6d7e32e244318b0 /DevTools/ProfileViewer/Profile.h | |
parent | 46a57c7f5905b8d82f1c810df8b6cc5a7f5970a6 (diff) | |
download | serenity-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.h | 29 |
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 }; }; |