diff options
author | rbuj <[email protected]> | 2019-04-20 12:01:36 +0200 |
---|---|---|
committer | lukefromdc <[email protected]> | 2019-04-28 22:34:36 -0400 |
commit | fc1f63b1c04cb6101f3a780e104a7f295c4d307a (patch) | |
tree | 0c75dd1010650682f6d199e247ec6d1962511c78 | |
parent | 1f42b9e3ab7f82825f2d0dc83a57163f5c67621c (diff) | |
download | mate-system-monitor-fc1f63b1c04cb6101f3a780e104a7f295c4d307a.tar.bz2 mate-system-monitor-fc1f63b1c04cb6101f3a780e104a7f295c4d307a.tar.xz |
Add disk IO on process info
Based on GNOME/gnome-system-monitor@60a787b
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/org.mate.system-monitor.gschema.xml.in | 36 | ||||
-rw-r--r-- | src/procman.h | 10 | ||||
-rw-r--r-- | src/procproperties.cpp | 11 | ||||
-rw-r--r-- | src/proctable.cpp | 51 | ||||
-rw-r--r-- | src/proctable.h | 4 | ||||
-rw-r--r-- | src/util.cpp | 43 | ||||
-rw-r--r-- | src/util.h | 4 |
8 files changed, 155 insertions, 6 deletions
diff --git a/configure.ac b/configure.ac index 1762fa8..1524bed 100644 --- a/configure.ac +++ b/configure.ac @@ -29,7 +29,7 @@ LT_INIT # Package dependencies GLIB_REQUIRED=2.50.0 -LIBGTOP_REQUIRED=2.23.1 +LIBGTOP_REQUIRED=2.37.2 GIOMM_REQUIRED=2.26.0 GLIBMM_REQUIRED=2.22 GTK_REQUIRED=3.22.0 diff --git a/src/org.mate.system-monitor.gschema.xml.in b/src/org.mate.system-monitor.gschema.xml.in index 703923d..7482621 100644 --- a/src/org.mate.system-monitor.gschema.xml.in +++ b/src/org.mate.system-monitor.gschema.xml.in @@ -397,11 +397,43 @@ </key> <key name="col-22-width" type="i"> <default>100</default> - <summary>Width of process 'Priority' column</summary> + <summary>Width of process “Disk Write Total” column</summary> </key> <key name="col-22-visible" type="b"> + <default>false</default> + <summary>Show process “Disk Write Total” column on startup</summary> + </key> + <key name="col-23-width" type="i"> + <default>100</default> + <summary>Width of process “Disk Read Total” column</summary> + </key> + <key name="col-23-visible" type="b"> + <default>false</default> + <summary>Show process “Disk Read Total” column on startup</summary> + </key> + <key name="col-24-width" type="i"> + <default>100</default> + <summary>Width of process “Disk Read” column</summary> + </key> + <key name="col-24-visible" type="b"> + <default>false</default> + <summary>Show process “Disk Read” column on startup</summary> + </key> + <key name="col-25-width" type="i"> + <default>100</default> + <summary>Width of process “Disk Write” column</summary> + </key> + <key name="col-25-visible" type="b"> + <default>false</default> + <summary>Show process “Disk Write” column on startup</summary> + </key> + <key name="col-26-width" type="i"> + <default>100</default> + <summary>Width of process “Priority” column</summary> + </key> + <key name="col-26-visible" type="b"> <default>true</default> - <summary>Show process 'Priority' column on startup</summary> + <summary>Show process “Priority” column on startup</summary> </key> </schema> <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.mate.system-monitor.disktreenew" path="/org/mate/system-monitor/disktreenew/"> diff --git a/src/procman.h b/src/procman.h index d7f1ce9..44ef2bc 100644 --- a/src/procman.h +++ b/src/procman.h @@ -114,7 +114,11 @@ struct ProcConfig struct MutableProcInfo { MutableProcInfo() -: status(0) + : disk_write_bytes_current(0ULL), + disk_read_bytes_current(0ULL), + disk_write_bytes_total(0ULL), + disk_read_bytes_total(0ULL), + status(0U) { } std::string user; @@ -136,6 +140,10 @@ MutableProcInfo() gulong start_time; guint64 cpu_time; + guint64 disk_write_bytes_current; + guint64 disk_read_bytes_current; + guint64 disk_write_bytes_total; + guint64 disk_read_bytes_total; guint status; guint pcpu; gint nice; diff --git a/src/procproperties.cpp b/src/procproperties.cpp index 1570bdb..d07da69 100644 --- a/src/procproperties.cpp +++ b/src/procproperties.cpp @@ -101,6 +101,15 @@ format_memsize(guint64 size) return g_format_size_full(size, G_FORMAT_SIZE_IEC_UNITS); } +static gchar* +format_size(guint64 size) +{ + if (size == 0) + return g_strdup(_("N/A")); + else + return g_format_size(size); +} + static void fill_proc_properties (GtkWidget *tree, ProcInfo *info) { @@ -122,6 +131,8 @@ fill_proc_properties (GtkWidget *tree, ProcInfo *info) { N_("Writable Memory"), format_memsize(info->memwritable)}, { N_("Shared Memory"), format_memsize(info->memshared)}, { N_("X Server Memory"), format_memsize(info->memxserver)}, + { N_("Disk Read Total"), format_size(info->disk_read_bytes_total)}, + { N_("Disk Write Total"), format_size(info->disk_write_bytes_total)}, { N_("CPU"), g_strdup_printf("%d%%", info->pcpu)}, { N_("CPU Time"), procman::format_duration_for_display(100 * info->cpu_time / ProcData::get_instance()->frequency) }, { N_("Started"), procman_format_date_for_display(info->start_time) }, diff --git a/src/proctable.cpp b/src/proctable.cpp index 2e0a4ac..94bf63f 100644 --- a/src/proctable.cpp +++ b/src/proctable.cpp @@ -28,6 +28,7 @@ #include <glibtop.h> #include <glibtop/loadavg.h> #include <glibtop/proclist.h> +#include <glibtop/procio.h> #include <glibtop/procstate.h> #include <glibtop/procmem.h> #include <glibtop/procmap.h> @@ -263,6 +264,10 @@ proctable_new (ProcData * const procdata) for multi-seat environments. See http://en.wikipedia.org/wiki/Multiseat_configuration */ N_("Seat"), N_("Owner"), + N_("Disk Read Total"), + N_("Disk Write Total"), + N_("Disk Read"), + N_("Disk Write"), N_("Priority"), NULL, "POINTER" @@ -298,6 +303,10 @@ proctable_new (ProcData * const procdata) G_TYPE_STRING, /* Session */ G_TYPE_STRING, /* Seat */ G_TYPE_STRING, /* Owner */ + G_TYPE_UINT64, /* Disk read total */ + G_TYPE_UINT64, /* Disk write total*/ + G_TYPE_UINT64, /* Disk read */ + G_TYPE_UINT64, /* Disk write */ G_TYPE_STRING, /* Priority */ GDK_TYPE_PIXBUF, /* Icon */ G_TYPE_POINTER, /* ProcInfo */ @@ -397,15 +406,32 @@ proctable_new (ProcData * const procdata) GUINT_TO_POINTER(i), NULL); break; + + case COL_DISK_READ_TOTAL: + case COL_DISK_WRITE_TOTAL: + gtk_tree_view_column_set_cell_data_func(col, cell, + &procman::storage_size_na_cell_data_func, + GUINT_TO_POINTER(i), + NULL); + break; + + case COL_DISK_READ_CURRENT: + case COL_DISK_WRITE_CURRENT: + gtk_tree_view_column_set_cell_data_func(col, cell, + &procman::io_rate_cell_data_func, + GUINT_TO_POINTER(i), + NULL); + break; + case COL_PRIORITY: gtk_tree_view_column_set_cell_data_func(col, cell, &procman::priority_cell_data_func, GUINT_TO_POINTER(COL_NICE), NULL); break; + default: gtk_tree_view_column_set_attributes(col, cell, "text", i, NULL); - break; } // sorting @@ -418,6 +444,10 @@ proctable_new (ProcData * const procdata) case COL_MEMWRITABLE: case COL_CPU: case COL_CPU_TIME: + case COL_DISK_READ_TOTAL: + case COL_DISK_WRITE_TOTAL: + case COL_DISK_READ_CURRENT: + case COL_DISK_WRITE_CURRENT: case COL_START_TIME: gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(model), i, procman::number_compare_func, GUINT_TO_POINTER(i), @@ -443,6 +473,10 @@ proctable_new (ProcData * const procdata) case COL_CPU: case COL_NICE: case COL_PID: + case COL_DISK_READ_TOTAL: + case COL_DISK_WRITE_TOTAL: + case COL_DISK_READ_CURRENT: + case COL_DISK_WRITE_CURRENT: case COL_CPU_TIME: case COL_MEM: g_object_set(G_OBJECT(cell), "xalign", 1.0f, NULL); @@ -650,6 +684,10 @@ update_info_mutable_cols(ProcInfo *info) tree_store_update(model, &info->node, COL_MEMXSERVER, info->memxserver); tree_store_update(model, &info->node, COL_CPU, info->pcpu); tree_store_update(model, &info->node, COL_CPU_TIME, info->cpu_time); + tree_store_update(model, &info->node, COL_DISK_READ_TOTAL, info->disk_read_bytes_total); + tree_store_update(model, &info->node, COL_DISK_WRITE_TOTAL, info->disk_write_bytes_total); + tree_store_update(model, &info->node, COL_DISK_READ_CURRENT, info->disk_read_bytes_current); + tree_store_update(model, &info->node, COL_DISK_WRITE_CURRENT, info->disk_write_bytes_current); tree_store_update(model, &info->node, COL_START_TIME, info->start_time); tree_store_update(model, &info->node, COL_NICE, info->nice); tree_store_update(model, &info->node, COL_MEM, info->mem); @@ -785,6 +823,7 @@ update_info (ProcData *procdata, ProcInfo *info) glibtop_proc_uid procuid; glibtop_proc_time proctime; glibtop_proc_kernel prockernel; + glibtop_proc_io procio; glibtop_get_proc_kernel(&prockernel, info->pid); g_strlcpy(info->wchan, prockernel.wchan, sizeof info->wchan); @@ -794,6 +833,7 @@ update_info (ProcData *procdata, ProcInfo *info) glibtop_get_proc_uid (&procuid, info->pid); glibtop_get_proc_time (&proctime, info->pid); + glibtop_get_proc_io (&procio, info->pid); get_process_memory_info(info); @@ -813,6 +853,15 @@ update_info (ProcData *procdata, ProcInfo *info) ProcInfo::cpu_times[info->pid] = info->cpu_time = proctime.rtime; info->nice = procuid.nice; + gdouble update_interval_seconds = procdata->config.update_interval / 1000.0; + difference = procio.disk_wbytes - info->disk_write_bytes_total; + info->disk_write_bytes_current = difference > update_interval_seconds ? difference/update_interval_seconds : 0ULL; + difference = procio.disk_rbytes - info->disk_read_bytes_total; + info->disk_read_bytes_current = difference > update_interval_seconds ? difference/update_interval_seconds : 0ULL; + + info->disk_write_bytes_total = procio.disk_wbytes; + info->disk_read_bytes_total = procio.disk_rbytes; + // set the ppid only if one can exist // i.e. pid=0 can never have a parent if (info->pid > 0) { diff --git a/src/proctable.h b/src/proctable.h index aca6e19..a3dce05 100644 --- a/src/proctable.h +++ b/src/proctable.h @@ -48,6 +48,10 @@ enum COL_SESSION, COL_SEAT, COL_OWNER, + COL_DISK_WRITE_TOTAL, + COL_DISK_READ_TOTAL, + COL_DISK_WRITE_CURRENT, + COL_DISK_READ_CURRENT, COL_PRIORITY, COL_PIXBUF, COL_POINTER, diff --git a/src/util.cpp b/src/util.cpp index a6f46af..14c559d 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -422,6 +422,47 @@ namespace procman } } + void io_rate_cell_data_func(GtkTreeViewColumn *, GtkCellRenderer *renderer, + GtkTreeModel *model, GtkTreeIter *iter, + gpointer user_data) + { + const guint index = GPOINTER_TO_UINT(user_data); + + guint64 size; + GValue value = { 0 }; + + gtk_tree_model_get_value(model, iter, index, &value); + + switch (G_VALUE_TYPE(&value)) { + case G_TYPE_ULONG: + size = g_value_get_ulong(&value); + break; + + case G_TYPE_UINT64: + size = g_value_get_uint64(&value); + break; + + default: + g_assert_not_reached(); + } + + g_value_unset(&value); + + if (size == 0) { + char *str = g_strdup_printf ("<i>%s</i>", _("N/A")); + g_object_set(renderer, "markup", str, NULL); + g_free(str); + } + else { + char *str = g_format_size(size); + char *formatted_str = g_strdup_printf(_("%s/s"), str); + g_object_set(renderer, "text", formatted_str, NULL); + g_free(formatted_str); + g_free(str); + } + + } + void duration_cell_data_func(GtkTreeViewColumn *, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) @@ -568,4 +609,4 @@ namespace procman g_free(current_value); } -}
\ No newline at end of file +} @@ -50,6 +50,10 @@ namespace procman GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data); + void io_rate_cell_data_func(GtkTreeViewColumn *col, GtkCellRenderer *renderer, + GtkTreeModel *model, GtkTreeIter *iter, + gpointer user_data); + void memory_size_na_cell_data_func(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data); |