From f91c499a4190b6f4ee3fb0c9235f68e1effb1060 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 18 Aug 2021 12:50:24 +0200 Subject: [PATCH] SystemMonitor: Consolidate hardware tabs + remove interrupts tab Combine the "PCI devices" and "Processors" tabs into a "Hardware" tab. And then remove the "Interrupts" tab because the number of received IRQ's per device is not really useful information to expose in this GUI. If the user needs this, he can check lsirq. --- .../Applications/SystemMonitor/CMakeLists.txt | 1 - .../SystemMonitor/InterruptsWidget.cpp | 48 ----- .../SystemMonitor/InterruptsWidget.h | 24 --- Userland/Applications/SystemMonitor/main.cpp | 191 +++++++++--------- 4 files changed, 91 insertions(+), 173 deletions(-) delete mode 100644 Userland/Applications/SystemMonitor/InterruptsWidget.cpp delete mode 100644 Userland/Applications/SystemMonitor/InterruptsWidget.h diff --git a/Userland/Applications/SystemMonitor/CMakeLists.txt b/Userland/Applications/SystemMonitor/CMakeLists.txt index e16ea63331..4ed531fca5 100644 --- a/Userland/Applications/SystemMonitor/CMakeLists.txt +++ b/Userland/Applications/SystemMonitor/CMakeLists.txt @@ -6,7 +6,6 @@ serenity_component( set(SOURCES GraphWidget.cpp - InterruptsWidget.cpp main.cpp MemoryStatsWidget.cpp NetworkStatisticsWidget.cpp diff --git a/Userland/Applications/SystemMonitor/InterruptsWidget.cpp b/Userland/Applications/SystemMonitor/InterruptsWidget.cpp deleted file mode 100644 index f46f01590b..0000000000 --- a/Userland/Applications/SystemMonitor/InterruptsWidget.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2020, the SerenityOS developers. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include "InterruptsWidget.h" -#include -#include -#include -#include -#include - -InterruptsWidget::InterruptsWidget() -{ - on_first_show = [this](auto&) { - set_layout(); - layout()->set_margins(4); - - Vector interrupts_field; - interrupts_field.empend("interrupt_line", "Line", Gfx::TextAlignment::CenterRight); - interrupts_field.empend("purpose", "Purpose", Gfx::TextAlignment::CenterLeft); - interrupts_field.empend("controller", "Controller", Gfx::TextAlignment::CenterLeft); - interrupts_field.empend("cpu_handler", "CPU Handler", Gfx::TextAlignment::CenterRight); - interrupts_field.empend("device_sharing", "# Devices Sharing", Gfx::TextAlignment::CenterRight); - interrupts_field.empend("call_count", "Call Count", Gfx::TextAlignment::CenterRight); - - m_interrupt_table_view = add(); - m_interrupt_model = GUI::JsonArrayModel::create("/proc/interrupts", move(interrupts_field)); - m_interrupt_table_view->set_model(GUI::SortingProxyModel::create(*m_interrupt_model)); - - m_update_timer = add( - 1000, [this] { - update_model(); - }); - - update_model(); - }; -} - -InterruptsWidget::~InterruptsWidget() -{ -} - -void InterruptsWidget::update_model() -{ - m_interrupt_model->invalidate(); -} diff --git a/Userland/Applications/SystemMonitor/InterruptsWidget.h b/Userland/Applications/SystemMonitor/InterruptsWidget.h deleted file mode 100644 index 638d502fe6..0000000000 --- a/Userland/Applications/SystemMonitor/InterruptsWidget.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2020, the SerenityOS developers. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include - -class InterruptsWidget final : public GUI::LazyWidget { - C_OBJECT(InterruptsWidget) -public: - virtual ~InterruptsWidget() override; - -private: - InterruptsWidget(); - void update_model(); - - RefPtr m_interrupt_table_view; - RefPtr m_interrupt_model; - RefPtr m_update_timer; -}; diff --git a/Userland/Applications/SystemMonitor/main.cpp b/Userland/Applications/SystemMonitor/main.cpp index 2830222c2a..3dbcdedb3e 100644 --- a/Userland/Applications/SystemMonitor/main.cpp +++ b/Userland/Applications/SystemMonitor/main.cpp @@ -5,7 +5,6 @@ */ #include "GraphWidget.h" -#include "InterruptsWidget.h" #include "MemoryStatsWidget.h" #include "NetworkStatisticsWidget.h" #include "ProcessFileDescriptorMapWidget.h" @@ -49,9 +48,8 @@ static NonnullRefPtr build_process_window(pid_t); static NonnullRefPtr build_file_systems_tab(); -static NonnullRefPtr build_pci_devices_tab(); +static NonnullRefPtr build_hardware_tab(); static NonnullRefPtr build_graphs_tab(); -static NonnullRefPtr build_processors_tab(); static RefPtr statusbar; @@ -157,7 +155,7 @@ int main(int argc, char** argv) const char* args_tab = "processes"; Core::ArgsParser parser; - parser.add_option(args_tab, "Tab, one of 'processes', 'graphs', 'fs', 'pci', 'devices', 'network', 'processors' or 'interrupts'", "open-tab", 't', "tab"); + parser.add_option(args_tab, "Tab, one of 'processes', 'graphs', 'fs', 'hardware', or 'network'", "open-tab", 't', "tab"); parser.parse(argc, argv); StringView args_tab_view = args_tab; @@ -196,18 +194,12 @@ int main(int argc, char** argv) auto file_systems_widget = build_file_systems_tab(); tabwidget.add_widget("File systems", file_systems_widget); - auto pci_devices_widget = build_pci_devices_tab(); - tabwidget.add_widget("PCI devices", pci_devices_widget); + auto hardware_widget = build_hardware_tab(); + tabwidget.add_widget("Hardware", hardware_widget); auto network_stats_widget = NetworkStatisticsWidget::construct(); tabwidget.add_widget("Network", network_stats_widget); - auto processors_widget = build_processors_tab(); - tabwidget.add_widget("Processors", processors_widget); - - auto interrupts_widget = InterruptsWidget::construct(); - tabwidget.add_widget("Interrupts", interrupts_widget); - process_table_container.set_layout(); process_table_container.layout()->set_margins(4); process_table_container.layout()->set_spacing(0); @@ -384,14 +376,10 @@ int main(int argc, char** argv) tabwidget.set_active_widget(graphs_widget); else if (args_tab_view == "fs") tabwidget.set_active_widget(file_systems_widget); - else if (args_tab_view == "pci") - tabwidget.set_active_widget(pci_devices_widget); + else if (args_tab_view == "hardware") + tabwidget.set_active_widget(hardware_widget); else if (args_tab_view == "network") tabwidget.set_active_widget(network_stats_widget); - else if (args_tab_view == "processors") - tabwidget.set_active_widget(processors_widget); - else if (args_tab_view == "interrupts") - tabwidget.set_active_widget(interrupts_widget); return app->exec(); } @@ -576,63 +564,101 @@ NonnullRefPtr build_file_systems_tab() return fs_widget; } -NonnullRefPtr build_pci_devices_tab() +NonnullRefPtr build_hardware_tab() { - auto pci_widget = GUI::LazyWidget::construct(); + auto widget = GUI::LazyWidget::construct(); - pci_widget->on_first_show = [](GUI::LazyWidget& self) { + widget->on_first_show = [](GUI::LazyWidget& self) { self.set_layout(); self.layout()->set_margins(4); - auto& pci_table_view = self.add(); - auto db = PCIDB::Database::open(); - if (!db) - warnln("Couldn't open PCI ID database!"); + { + auto& cpu_group_box = self.add("CPUs"); + cpu_group_box.set_layout(); + cpu_group_box.layout()->set_margins({ 16, 6, 6 }); - Vector pci_fields; - pci_fields.empend( - "Address", Gfx::TextAlignment::CenterLeft, - [](const JsonObject& object) { - auto seg = object.get("seg").to_u32(); - auto bus = object.get("bus").to_u32(); - auto device = object.get("device").to_u32(); - auto function = object.get("function").to_u32(); - return String::formatted("{:04x}:{:02x}:{:02x}.{}", seg, bus, device, function); - }); - pci_fields.empend( - "Class", Gfx::TextAlignment::CenterLeft, - [db](const JsonObject& object) { - auto class_id = object.get("class").to_u32(); - String class_name = db ? db->get_class(class_id) : nullptr; - return class_name.is_empty() ? String::formatted("{:04x}", class_id) : class_name; - }); - pci_fields.empend( - "Vendor", Gfx::TextAlignment::CenterLeft, - [db](const JsonObject& object) { - auto vendor_id = object.get("vendor_id").to_u32(); - String vendor_name = db ? db->get_vendor(vendor_id) : nullptr; - return vendor_name.is_empty() ? String::formatted("{:02x}", vendor_id) : vendor_name; - }); - pci_fields.empend( - "Device", Gfx::TextAlignment::CenterLeft, - [db](const JsonObject& object) { - auto vendor_id = object.get("vendor_id").to_u32(); - auto device_id = object.get("device_id").to_u32(); - String device_name = db ? db->get_device(vendor_id, device_id) : nullptr; - return device_name.is_empty() ? String::formatted("{:02x}", device_id) : device_name; - }); - pci_fields.empend( - "Revision", Gfx::TextAlignment::CenterRight, - [](const JsonObject& object) { - auto revision_id = object.get("revision_id").to_u32(); - return String::formatted("{:02x}", revision_id); + Vector processors_field; + processors_field.empend("processor", "Processor", Gfx::TextAlignment::CenterRight); + processors_field.empend("cpuid", "CPUID", Gfx::TextAlignment::CenterLeft); + processors_field.empend("brandstr", "Brand", Gfx::TextAlignment::CenterLeft); + processors_field.empend("Features", Gfx::TextAlignment::CenterLeft, [](auto& object) { + StringBuilder builder; + auto features = object.get("features").as_array(); + for (auto& feature : features.values()) { + builder.append(feature.to_string()); + builder.append(' '); + } + return GUI::Variant(builder.to_string()); }); + processors_field.empend("family", "Family", Gfx::TextAlignment::CenterRight); + processors_field.empend("model", "Model", Gfx::TextAlignment::CenterRight); + processors_field.empend("stepping", "Stepping", Gfx::TextAlignment::CenterRight); + processors_field.empend("type", "Type", Gfx::TextAlignment::CenterRight); - pci_table_view.set_model(GUI::SortingProxyModel::create(GUI::JsonArrayModel::create("/proc/pci", move(pci_fields)))); - pci_table_view.model()->invalidate(); + auto& processors_table_view = cpu_group_box.add(); + auto json_model = GUI::JsonArrayModel::create("/proc/cpuinfo", move(processors_field)); + processors_table_view.set_model(json_model); + json_model->invalidate(); + + cpu_group_box.set_fixed_height(128); + } + + { + auto& pci_group_box = self.add("PCI devices"); + pci_group_box.set_layout(); + pci_group_box.layout()->set_margins({ 16, 6, 6 }); + + auto& pci_table_view = pci_group_box.add(); + + auto db = PCIDB::Database::open(); + if (!db) + warnln("Couldn't open PCI ID database!"); + + Vector pci_fields; + pci_fields.empend( + "Address", Gfx::TextAlignment::CenterLeft, + [](const JsonObject& object) { + auto seg = object.get("seg").to_u32(); + auto bus = object.get("bus").to_u32(); + auto device = object.get("device").to_u32(); + auto function = object.get("function").to_u32(); + return String::formatted("{:04x}:{:02x}:{:02x}.{}", seg, bus, device, function); + }); + pci_fields.empend( + "Class", Gfx::TextAlignment::CenterLeft, + [db](const JsonObject& object) { + auto class_id = object.get("class").to_u32(); + String class_name = db ? db->get_class(class_id) : nullptr; + return class_name.is_empty() ? String::formatted("{:04x}", class_id) : class_name; + }); + pci_fields.empend( + "Vendor", Gfx::TextAlignment::CenterLeft, + [db](const JsonObject& object) { + auto vendor_id = object.get("vendor_id").to_u32(); + String vendor_name = db ? db->get_vendor(vendor_id) : nullptr; + return vendor_name.is_empty() ? String::formatted("{:02x}", vendor_id) : vendor_name; + }); + pci_fields.empend( + "Device", Gfx::TextAlignment::CenterLeft, + [db](const JsonObject& object) { + auto vendor_id = object.get("vendor_id").to_u32(); + auto device_id = object.get("device_id").to_u32(); + String device_name = db ? db->get_device(vendor_id, device_id) : nullptr; + return device_name.is_empty() ? String::formatted("{:02x}", device_id) : device_name; + }); + pci_fields.empend( + "Revision", Gfx::TextAlignment::CenterRight, + [](const JsonObject& object) { + auto revision_id = object.get("revision_id").to_u32(); + return String::formatted("{:02x}", revision_id); + }); + + pci_table_view.set_model(GUI::SortingProxyModel::create(GUI::JsonArrayModel::create("/proc/pci", move(pci_fields)))); + pci_table_view.model()->invalidate(); + } }; - return pci_widget; + return widget; } NonnullRefPtr build_graphs_tab() @@ -704,38 +730,3 @@ NonnullRefPtr build_graphs_tab() graphs_container->add(memory_graph); return graphs_container; } - -NonnullRefPtr build_processors_tab() -{ - auto processors_widget = GUI::LazyWidget::construct(); - - processors_widget->on_first_show = [](GUI::LazyWidget& self) { - self.set_layout(); - self.layout()->set_margins(4); - - Vector processors_field; - processors_field.empend("processor", "Processor", Gfx::TextAlignment::CenterRight); - processors_field.empend("cpuid", "CPUID", Gfx::TextAlignment::CenterLeft); - processors_field.empend("brandstr", "Brand", Gfx::TextAlignment::CenterLeft); - processors_field.empend("Features", Gfx::TextAlignment::CenterLeft, [](auto& object) { - StringBuilder builder; - auto features = object.get("features").as_array(); - for (auto& feature : features.values()) { - builder.append(feature.to_string()); - builder.append(' '); - } - return GUI::Variant(builder.to_string()); - }); - processors_field.empend("family", "Family", Gfx::TextAlignment::CenterRight); - processors_field.empend("model", "Model", Gfx::TextAlignment::CenterRight); - processors_field.empend("stepping", "Stepping", Gfx::TextAlignment::CenterRight); - processors_field.empend("type", "Type", Gfx::TextAlignment::CenterRight); - - auto& processors_table_view = self.add(); - auto json_model = GUI::JsonArrayModel::create("/proc/cpuinfo", move(processors_field)); - processors_table_view.set_model(json_model); - json_model->invalidate(); - }; - - return processors_widget; -}