1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 02:07:34 +00:00

Kernel+ProfileViewer: Display additional filesystem events

This commit is contained in:
Jakub Berkop 2023-08-25 23:47:42 +02:00 committed by Andrew Kaster
parent c184a0786f
commit 54e79aa1d9
16 changed files with 655 additions and 135 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2022, Jakub Berkop <jakub.berkop@gmail.com>
* Copyright (c) 2022-2023, Jakub Berkop <jakub.berkop@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -22,11 +22,20 @@ FileEventModel::~FileEventModel()
{
}
u64 FileEventNode::total_count() const
{
return m_open.count + m_close.count + m_readv.count + m_read.count + m_pread.count;
}
Duration FileEventNode::total_duration() const
{
return m_open.duration + m_close.duration + m_readv.duration + m_read.duration + m_pread.duration;
}
FileEventNode& FileEventNode::find_or_create_node(DeprecatedString const& searched_path)
{
// TODO: Optimize this function.
if (searched_path == ""sv) {
if (searched_path == ""sv || searched_path == "/"sv) {
return *this;
}
@ -67,7 +76,7 @@ FileEventNode& FileEventNode::create_recursively(DeprecatedString new_path)
auto parts = lex_path.parts();
if (parts.size() == 1) {
auto new_node = FileEventNode::create(new_path, this);
auto new_node = FileEventNode::create(parts.take_first(), this);
m_children.append(new_node);
return *new_node.ptr();
} else {
@ -147,10 +156,30 @@ ErrorOr<String> FileEventModel::column_name(int column) const
switch (column) {
case Column::Path:
return "Path"_string;
case Column::Count:
return "Event Count"_string;
case Column::Duration:
return "Duration [ms]"_string;
case Column::TotalCount:
return "Total Count"_string;
case Column::TotalDuration:
return "Total Duration [ms]"_string;
case Column::OpenCount:
return "Open Count"_string;
case Column::OpenDuration:
return "Open Duration [ms]"_string;
case Column::CloseCount:
return "Close Count"_string;
case Column::CloseDuration:
return "Close Duration [ms]"_string;
case Column::ReadvCount:
return "Readv Count"_string;
case Column::ReadvDuration:
return "Readv Duration [ms]"_string;
case Column::ReadCount:
return "Read Count"_string;
case Column::ReadDuration:
return "Read Duration [ms]"_string;
case Column::PreadCount:
return "Pread Count"_string;
case Column::PreadDuration:
return "Pread Duration [ms]"_string;
default:
VERIFY_NOT_REACHED();
}
@ -167,19 +196,36 @@ GUI::Variant FileEventModel::data(GUI::ModelIndex const& index, GUI::ModelRole r
auto* node = static_cast<FileEventNode*>(index.internal_data());
if (role == GUI::ModelRole::Display) {
if (index.column() == Column::Count) {
return node->count();
}
if (index.column() == Column::Path) {
switch (index.column()) {
case Column::Path:
return node->path();
case Column::TotalCount:
return node->total_count();
case Column::TotalDuration:
return static_cast<f32>(node->total_duration().to_nanoseconds()) / 1'000'000;
case Column::OpenCount:
return node->open().count;
case Column::OpenDuration:
return static_cast<f32>(node->open().duration.to_nanoseconds()) / 1'000'000;
case Column::CloseCount:
return node->close().count;
case Column::CloseDuration:
return static_cast<f32>(node->close().duration.to_nanoseconds()) / 1'000'000;
case Column::ReadvCount:
return node->readv().count;
case Column::ReadvDuration:
return static_cast<f32>(node->readv().duration.to_nanoseconds()) / 1'000'000;
case Column::ReadCount:
return node->read().count;
case Column::ReadDuration:
return static_cast<f32>(node->read().duration.to_nanoseconds()) / 1'000'000;
case Column::PreadCount:
return node->pread().count;
case Column::PreadDuration:
return static_cast<f32>(node->pread().duration.to_nanoseconds()) / 1'000'000;
default:
return {};
}
if (index.column() == Column::Duration) {
return node->duration();
}
return {};
}
return {};