소스 검색

SystemMonitor: Show information about purgeable memory

This patch exposes some fields about purgeable memory regions.
We now also show total purgeable volatile and non-volatile memory in
the big process table.
Andreas Kling 5 년 전
부모
커밋
92b46d9814

+ 7 - 0
Applications/SystemMonitor/ProcessMemoryMapWidget.cpp

@@ -30,6 +30,13 @@ ProcessMemoryMapWidget::ProcessMemoryMapWidget(GWidget* parent)
             builder.append('T');
         return builder.to_string();
     });
+    pid_vm_fields.empend("Purgeable", TextAlignment::CenterLeft, [](auto& object) {
+        if (!object.get("purgeable").to_bool())
+            return "";
+        if (object.get("volatile").to_bool())
+            return "Volatile";
+        return "Non-volatile";
+    });
     pid_vm_fields.empend("name", "Name", TextAlignment::CenterLeft);
     m_json_model = GJsonArrayModel::create({}, move(pid_vm_fields));
     m_table_view->set_model(GSortingProxyModel::create(*m_json_model));

+ 18 - 0
Applications/SystemMonitor/ProcessModel.cpp

@@ -59,6 +59,10 @@ String ProcessModel::column_name(int column) const
         return "Virtual";
     case Column::Physical:
         return "Physical";
+    case Column::PurgeableVolatile:
+        return "Purg:V";
+    case Column::PurgeableNonvolatile:
+        return "Purg:N";
     case Column::CPU:
         return "CPU";
     case Column::Name:
@@ -107,6 +111,10 @@ GModel::ColumnMetadata ProcessModel::column_metadata(int column) const
         return { 65, TextAlignment::CenterRight };
     case Column::Physical:
         return { 65, TextAlignment::CenterRight };
+    case Column::PurgeableVolatile:
+        return { 65, TextAlignment::CenterRight };
+    case Column::PurgeableNonvolatile:
+        return { 65, TextAlignment::CenterRight };
     case Column::CPU:
         return { 32, TextAlignment::CenterRight };
     case Column::Name:
@@ -175,6 +183,10 @@ GVariant ProcessModel::data(const GModelIndex& index, Role role) const
             return (int)thread.current_state.amount_virtual;
         case Column::Physical:
             return (int)thread.current_state.amount_resident;
+        case Column::PurgeableVolatile:
+            return (int)thread.current_state.amount_purgeable_volatile;
+        case Column::PurgeableNonvolatile:
+            return (int)thread.current_state.amount_purgeable_nonvolatile;
         case Column::CPU:
             return thread.current_state.cpu_percent;
         case Column::Name:
@@ -239,6 +251,10 @@ GVariant ProcessModel::data(const GModelIndex& index, Role role) const
             return pretty_byte_size(thread.current_state.amount_virtual);
         case Column::Physical:
             return pretty_byte_size(thread.current_state.amount_resident);
+        case Column::PurgeableVolatile:
+            return pretty_byte_size(thread.current_state.amount_purgeable_volatile);
+        case Column::PurgeableNonvolatile:
+            return pretty_byte_size(thread.current_state.amount_purgeable_nonvolatile);
         case Column::CPU:
             return thread.current_state.cpu_percent;
         case Column::Name:
@@ -297,6 +313,8 @@ void ProcessModel::update()
             state.file_write_bytes = thread.file_write_bytes;
             state.amount_virtual = it.value.amount_virtual;
             state.amount_resident = it.value.amount_resident;
+            state.amount_purgeable_volatile = it.value.amount_purgeable_volatile;
+            state.amount_purgeable_nonvolatile = it.value.amount_purgeable_nonvolatile;
             state.icon_id = it.value.icon_id;
 
             state.name = thread.name;

+ 4 - 0
Applications/SystemMonitor/ProcessModel.h

@@ -30,6 +30,8 @@ public:
         TID,
         Virtual,
         Physical,
+        PurgeableVolatile,
+        PurgeableNonvolatile,
         Syscalls,
         InodeFaults,
         ZeroFaults,
@@ -70,6 +72,8 @@ private:
         String priority;
         size_t amount_virtual;
         size_t amount_resident;
+        size_t amount_purgeable_volatile;
+        size_t amount_purgeable_nonvolatile;
         unsigned syscall_count;
         unsigned inode_faults;
         unsigned zero_faults;

+ 2 - 0
Libraries/LibCore/CProcessStatisticsReader.cpp

@@ -38,6 +38,8 @@ HashMap<pid_t, CProcessStatistics> CProcessStatisticsReader::get_all()
         process.amount_virtual = process_object.get("amount_virtual").to_u32();
         process.amount_resident = process_object.get("amount_resident").to_u32();
         process.amount_shared = process_object.get("amount_shared").to_u32();
+        process.amount_purgeable_volatile = process_object.get("amount_purgeable_volatile").to_u32();
+        process.amount_purgeable_nonvolatile = process_object.get("amount_purgeable_nonvolatile").to_u32();
         process.icon_id = process_object.get("icon_id").to_int();
 
         auto thread_array = process_object.get("threads").as_array();

+ 2 - 0
Libraries/LibCore/CProcessStatisticsReader.h

@@ -39,6 +39,8 @@ struct CProcessStatistics {
     size_t amount_virtual;
     size_t amount_resident;
     size_t amount_shared;
+    size_t amount_purgeable_volatile;
+    size_t amount_purgeable_nonvolatile;
     int icon_id;
 
     Vector<CThreadStatistics> threads;