other: make gpu memory collection configurable (#835)

Follow-up to #794, this makes GPU memory collection toggleable.
This commit is contained in:
Clement Tsang 2022-10-15 16:50:21 -04:00 committed by GitHub
parent bd35bbdc9c
commit a949740c94
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 64 additions and 145 deletions

View File

@ -67,7 +67,7 @@ pub struct AppConfigFields {
pub use_old_network_legend: bool,
pub table_gap: u16,
pub disable_click: bool,
pub no_write: bool,
pub enable_gpu_memory: bool,
pub show_table_scroll_position: bool,
pub is_advanced_kill: bool,
// TODO: Remove these, move network details state-side.

View File

@ -405,11 +405,18 @@ impl DataCollector {
let mem_data_fut = {
#[cfg(not(target_os = "freebsd"))]
{
memory::get_mem_data(self.widgets_to_harvest.use_mem)
memory::get_mem_data(
self.widgets_to_harvest.use_mem,
self.widgets_to_harvest.use_gpu,
)
}
#[cfg(target_os = "freebsd")]
{
memory::get_mem_data(&self.sys, self.widgets_to_harvest.use_mem)
memory::get_mem_data(
&self.sys,
self.widgets_to_harvest.use_mem,
self.widgets_to_harvest.use_gpu,
)
}
};
let disk_data_fut = disks::get_disk_usage(

View File

@ -2,7 +2,7 @@
use crate::data_harvester::memory::{MemCollect, MemHarvest};
pub async fn get_mem_data(actually_get: bool) -> MemCollect {
pub async fn get_mem_data(actually_get: bool, _get_gpu: bool) -> MemCollect {
if !actually_get {
MemCollect {
ram: Ok(None),
@ -19,7 +19,11 @@ pub async fn get_mem_data(actually_get: bool) -> MemCollect {
#[cfg(feature = "zfs")]
arc: get_arc_data().await,
#[cfg(feature = "gpu")]
gpus: get_gpu_data().await,
gpus: if _get_gpu {
get_gpu_data().await
} else {
Ok(None)
},
}
}
}

View File

@ -3,7 +3,7 @@
use crate::data_harvester::memory::{MemCollect, MemHarvest};
use sysinfo::{System, SystemExt};
pub async fn get_mem_data(sys: &System, actually_get: bool) -> MemCollect {
pub async fn get_mem_data(sys: &System, actually_get: bool, _get_gpu: bool) -> MemCollect {
if !actually_get {
MemCollect {
ram: Ok(None),
@ -20,7 +20,11 @@ pub async fn get_mem_data(sys: &System, actually_get: bool) -> MemCollect {
#[cfg(feature = "zfs")]
arc: get_arc_data().await,
#[cfg(feature = "gpu")]
gpus: get_gpu_data().await,
gpus: if _get_gpu {
get_gpu_data().await
} else {
Ok(None)
},
}
}
}

View File

@ -1001,6 +1001,7 @@ Supported widget names:
pub struct UsedWidgets {
pub use_cpu: bool,
pub use_mem: bool,
pub use_gpu: bool,
pub use_net: bool,
pub use_proc: bool,
pub use_disk: bool,

View File

@ -104,9 +104,10 @@ impl Painter {
#[cfg(feature = "gpu")]
{
let gpu_styles = &self.colours.gpu_colour_styles;
let mut color_index = 0;
if let Some(gpu_data) = &app_state.converted_data.gpu_data {
let gpu_styles = &self.colours.gpu_colour_styles;
let mut color_index = 0;
gpu_data.iter().for_each(|gpu_data_vec| {
let gpu_data = gpu_data_vec.points.as_slice();
let gpu_percentage = if let Some(gpu) = gpu_data.last() {

View File

@ -348,7 +348,8 @@ use CPU (3) as the default instead.
"Displays the network widget with binary prefixes (i.e. kibibits, mebibits) rather than a decimal prefix (i.e. kilobits, megabits). Defaults to decimal prefixes.",
);
let app = Command::new(crate_name!())
#[allow(unused_mut)]
let mut app = Command::new(crate_name!())
.version(crate_version!())
.author(crate_authors!())
.about(crate_description!())
@ -392,19 +393,27 @@ use CPU (3) as the default instead.
.arg(use_old_network_legend)
.arg(whole_word);
if cfg!(feature = "battery") {
#[cfg(feature = "battery")]
{
let battery = Arg::new("battery")
.long("battery")
.help("Shows the battery widget.")
.long_help(
"Shows the battery widget in default or basic mode. No effect on custom layouts.",
);
app.arg(battery)
} else {
app
app = app.arg(battery);
}
}
#[cfg(feature = "gpu")]
{
let enable_gpu_memory = Arg::new("enable_gpu_memory")
.long("enable_gpu_memory")
.help("Enable collecting and displaying GPU memory usage.");
app = app.arg(enable_gpu_memory);
}
app
}
#[cfg(test)]
mod test {
use super::*;

View File

@ -53,123 +53,39 @@ impl Config {
#[derive(Clone, Debug, Default, Deserialize, Serialize, TypedBuilder)]
pub struct ConfigFlags {
#[builder(default, setter(strip_option))]
pub hide_avg_cpu: Option<bool>,
#[builder(default, setter(strip_option))]
pub dot_marker: Option<bool>,
#[builder(default, setter(strip_option))]
pub temperature_type: Option<String>,
#[builder(default, setter(strip_option))]
pub rate: Option<u64>,
#[builder(default, setter(strip_option))]
pub left_legend: Option<bool>,
#[builder(default, setter(strip_option))]
pub current_usage: Option<bool>,
#[builder(default, setter(strip_option))]
pub group_processes: Option<bool>,
#[builder(default, setter(strip_option))]
pub case_sensitive: Option<bool>,
#[builder(default, setter(strip_option))]
pub whole_word: Option<bool>,
#[builder(default, setter(strip_option))]
pub regex: Option<bool>,
#[builder(default, setter(strip_option))]
pub basic: Option<bool>,
#[builder(default, setter(strip_option))]
pub default_time_value: Option<u64>,
#[builder(default, setter(strip_option))]
pub time_delta: Option<u64>,
#[builder(default, setter(strip_option))]
pub autohide_time: Option<bool>,
#[builder(default, setter(strip_option))]
pub hide_time: Option<bool>,
#[builder(default, setter(strip_option))]
pub default_widget_type: Option<String>,
#[builder(default, setter(strip_option))]
pub default_widget_count: Option<u64>,
#[builder(default, setter(strip_option))]
pub use_old_network_legend: Option<bool>,
#[builder(default, setter(strip_option))]
pub hide_table_gap: Option<bool>,
#[builder(default, setter(strip_option))]
pub battery: Option<bool>,
#[builder(default, setter(strip_option))]
pub disable_click: Option<bool>,
#[builder(default, setter(strip_option))]
pub no_write: Option<bool>,
// For built-in colour palettes.
#[builder(default, setter(strip_option))]
pub color: Option<String>,
// This is a huge hack to enable hashmap functionality WITHOUT being able to serializing the field.
// Basically, keep a hashmap in the struct, and convert to a vector every time.
#[builder(default, setter(strip_option))]
#[serde(skip)]
pub search_case_enabled_widgets_map: Option<HashMap<u64, bool>>,
#[builder(default, setter(strip_option))]
pub search_case_enabled_widgets: Option<Vec<WidgetIdEnabled>>,
#[builder(default, setter(strip_option))]
#[serde(skip)]
pub search_whole_word_enabled_widgets_map: Option<HashMap<u64, bool>>,
#[builder(default, setter(strip_option))]
pub search_whole_word_enabled_widgets: Option<Vec<WidgetIdEnabled>>,
#[builder(default, setter(strip_option))]
#[serde(skip)]
pub search_regex_enabled_widgets_map: Option<HashMap<u64, bool>>,
#[builder(default, setter(strip_option))]
pub search_regex_enabled_widgets: Option<Vec<WidgetIdEnabled>>,
// End hack
#[builder(default, setter(strip_option))]
pub mem_as_value: Option<bool>,
#[builder(default, setter(strip_option))]
pub tree: Option<bool>,
#[builder(default, setter(strip_option))]
show_table_scroll_position: Option<bool>,
#[builder(default, setter(strip_option))]
pub process_command: Option<bool>,
#[builder(default, setter(strip_option))]
pub disable_advanced_kill: Option<bool>,
#[builder(default, setter(strip_option))]
pub network_use_bytes: Option<bool>,
#[builder(default, setter(strip_option))]
pub network_use_log: Option<bool>,
#[builder(default, setter(strip_option))]
pub network_use_binary_prefix: Option<bool>,
pub enable_gpu_memory: Option<bool>,
}
#[derive(Clone, Default, Debug, Deserialize, Serialize)]
@ -317,8 +233,7 @@ pub fn build_app(
1
},
disable_click: get_disable_click(matches, config),
// no_write: get_no_write(matches, config),
no_write: false,
enable_gpu_memory: get_enable_gpu_memory(matches, config),
show_table_scroll_position: get_show_table_scroll_position(matches, config),
is_advanced_kill,
network_scale_type,
@ -461,9 +376,16 @@ pub fn build_app(
None
};
let use_mem = used_widget_set.get(&Mem).is_some() || used_widget_set.get(&BasicMem).is_some();
let used_widgets = UsedWidgets {
use_cpu: used_widget_set.get(&Cpu).is_some() || used_widget_set.get(&BasicCpu).is_some(),
use_mem: used_widget_set.get(&Mem).is_some() || used_widget_set.get(&BasicMem).is_some(),
use_mem,
use_gpu: use_mem
&& config
.flags
.as_ref()
.and_then(|f| f.enable_gpu_memory)
.unwrap_or(false),
use_net: used_widget_set.get(&Net).is_some() || used_widget_set.get(&BasicNet).is_some(),
use_proc: used_widget_set.get(&Proc).is_some(),
use_disk: used_widget_set.get(&Disk).is_some(),
@ -480,48 +402,6 @@ pub fn build_app(
let net_filter =
get_ignore_list(&config.net_filter).context("Update 'net_filter' in your config file")?;
// One more thing - we have to update the search settings of our proc_state_map, and create the hashmaps if needed!
// Note that if you change your layout, this might not actually match properly... not sure if/where we should deal with that...
if let Some(flags) = &mut config.flags {
if flags.case_sensitive.is_none() && !matches.is_present("case_sensitive") {
if let Some(search_case_enabled_widgets) = &flags.search_case_enabled_widgets {
let mapping = HashMap::new();
for widget in search_case_enabled_widgets {
if let Some(proc_widget) = proc_state_map.get_mut(&widget.id) {
proc_widget.proc_search.is_ignoring_case = !widget.enabled;
}
}
flags.search_case_enabled_widgets_map = Some(mapping);
}
}
if flags.whole_word.is_none() && !matches.is_present("whole_word") {
if let Some(search_whole_word_enabled_widgets) =
&flags.search_whole_word_enabled_widgets
{
let mapping = HashMap::new();
for widget in search_whole_word_enabled_widgets {
if let Some(proc_widget) = proc_state_map.get_mut(&widget.id) {
proc_widget.proc_search.is_searching_whole_word = widget.enabled;
}
}
flags.search_whole_word_enabled_widgets_map = Some(mapping);
}
}
if flags.regex.is_none() && !matches.is_present("regex") {
if let Some(search_regex_enabled_widgets) = &flags.search_regex_enabled_widgets {
let mapping = HashMap::new();
for widget in search_regex_enabled_widgets {
if let Some(proc_widget) = proc_state_map.get_mut(&widget.id) {
proc_widget.proc_search.is_searching_with_regex = widget.enabled;
}
}
flags.search_regex_enabled_widgets_map = Some(mapping);
}
}
}
Ok(App::builder()
.app_config_fields(app_config_fields)
.cpu_state(CpuState::init(cpu_state_map))
@ -948,6 +828,19 @@ fn get_use_battery(matches: &clap::ArgMatches, config: &Config) -> bool {
false
}
fn get_enable_gpu_memory(matches: &clap::ArgMatches, config: &Config) -> bool {
if cfg!(feature = "gpu") {
if matches.is_present("enable_gpu_memory") {
return true;
} else if let Some(flags) = &config.flags {
if let Some(enable_gpu_memory) = flags.enable_gpu_memory {
return enable_gpu_memory;
}
}
}
false
}
#[allow(dead_code)]
fn get_no_write(matches: &clap::ArgMatches, config: &Config) -> bool {
if matches.is_present("no_write") {